>假设您有描述应用程序的数据访问层的接口。您还没有决定要使用哪种存储机制,您只想确保无论您选择什么,它都能很好地处理并发请求。为此,您必须针对这些接口编写并发测试。
我认为示意图并发测试应该是这样的:
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,而不是设置变量,请使用 += 和 -=。