在PHP中并行执行代码以最小化执行时间

时间:2014-11-29 05:54:13

标签: php curl parallel-processing pthreads execution-time

初始条件:我的代码是用php文件编写的。最初我正在执行代码,它需要30秒才能执行。在这个文件中,代码被调用了5次。

接下来会发生什么:如果我需要执行此代码50次,那么在browser.next的一次执行中需要300秒才能执行500次3000秒。所以它是代码的串行执行。

我需要什么:我需要并行执行此代码。像几个例子。所以我想尽量减少执行时间,这样用户就不会等待这么长时间。

我做了什么:我使用PHP CURL并行执行此代码。我多次调用此文件以最小化执行时间。

所以我想知道这个方法是正确的。我可以执行多少CURL以及它需要多少资源。它需要一个更好的方法,我怎么能与教程并行执行此代码。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:0)

但是,如果不更改代码(太多),最简单的选择可能是通过命令行而不是CURL调用PHP。这减少了APACHE(内存和速度),网络等的开销。加上Curl不是一个便携式选项,因为有些服务器无法看到自己(用网络术语)。

$process1 = popen('php myfile.php [parameters]');
$process2 = popen('php myfile.php [parameters]');

// get response from children : you can loop until all completed
$response1 = stream_get_contents($process1);
$response2 = stream_get_contents($process2);

您需要在$ _SERVER中删除对apache添加变量的任何引用,并将$ _GET替换为argv / argc引用。否则它应该只是工作。

但最好的解决方案可能是pThreads(http://php.net/manual/en/book.pthreads.php),它可以让你做你想做的事。需要对代码进行一些编辑(以及可能的安装),但要做的就是你所要求的。

答案 1 :(得分:0)

php curl是足够低的开销,不必担心它。如果您可以通过负载均衡器对服务器场进行回送调用,那么这是curl的一个很好的用例。我也使用pcntl_fork()进行同一主机并行,但设置起来比较困难。我写过基于两者的课程;在https://github.com/andrasq/quicklib看到我的php lib的想法(或者只是借用代码,它是开源的)

答案 2 :(得分:0)

考虑使用Gearman。文件: http://php.net/manual/en/book.gearman.php