PHP - 数据访问并发测试


PHP - data access concurrency testing

>假设您有描述应用程序的数据访问层的接口。您还没有决定要使用哪种存储机制,您只想确保无论您选择什么,它都能很好地处理并发请求。为此,您必须针对这些接口编写并发测试。

我认为示意图并发测试应该是这样的:

public function testMoneyIsNotLostByConcurrentTransfers(){
    $accountRepository = DataAccessLayer::getBankAccountRepository();
    $accountOfTom = $accountRepository->create(array(
        'owner' => 'Tom',
        'balance' => new Money(10000)
    ));
    $accountOfBob = $accountRepository->create(array(
        'owner' => 'Bob',
        'balance' => new Money(10000)
    ));
    $accountOfSusanne = $accountRepository->create(array(
        'owner' => 'Susanne',
        'balance' => new Money(10000)
    ));
    $this->concurrentExecution(
        function () use ($accountOfTom, $accountOfBob){
            $accountOfTom->transfer($accountOfBob, new Money(5000));
        },
        function() use ($accountOfTom, $accountOfSusanne){
            $accountOfSusanne->transfer($accountOfTom, new Money(5000));
        }
    );
    $this->assertEquals($accountOfTom->getBalanceAmount(), 10000);
    $this->assertEquals($accountOfBob->getBalanceAmount(), 15000);
    $this->assertEquals($accountOfSusanne->getBalanceAmount(), 5000);
}

是否可以在PHP中编写这样的测试,测试运行程序?或者是否有任何现有的工具可以帮助PHP中的并发测试?

我找不到任何用于此类并发测试的测试运行器。我发现只有paratest,它可以运行独立的测试,如并行单元测试。

根据 PHP - 并行任务运行器,我认为最好的选择是将 pthreads 与 debug_backtrace一起使用。我认为即使这样也会很难。我很期待安装问题、线程安全、资源共享困难、回溯错误等......我相信我会玩得很开心...:S

我在 pthreads 示例中发现了异步调用。

如果我设法解决这个问题,我将在 github 上分享它并在此处添加一个链接。在那之前...

更新

刚刚意识到我不需要多线程或多进程应用程序来测试并发性。例如,我可以从同一个 php 文件使用 2 个数据库连接启动两个事务。我需要为数据库驱动程序执行的语句添加事件触发,以便我可以添加断点并在我想要的任何位置等待其他任务。文件锁定是一样的...因此,协程或一些手工制作的多任务处理和语句日志记录就足够了......

并发应该内置到您的保存机制中,而不是执行层中。

例如,如果您使用的是 SQL,而不是设置变量,请使用 += 和 -=。