bin*_*yLV 10 php parallel-processing
PHP可以调用函数而不是等待它返回吗?所以像这样:
function callback($pause, $arg) {
sleep($pause);
echo $arg, "\n";
}
header('Content-Type: text/plain');
fast_call_user_func_array('callback', array(3, 'three'));
fast_call_user_func_array('callback', array(2, 'two'));
fast_call_user_func_array('callback', array(1, 'one'));
Run Code Online (Sandbox Code Playgroud)
会输出
one (after 1 second)
two (after 2 seconds)
three (after 3 seconds)
Run Code Online (Sandbox Code Playgroud)
而不是
three (after 3 seconds)
two (after 3 + 2 = 5 seconds)
one (after 3 + 2 + 1 = 6 seconds)
Run Code Online (Sandbox Code Playgroud)
主脚本旨在作为永久进程(TCP服务器)运行.callback()函数将从客户端接收数据,执行外部PHP脚本,然后根据传递给的其他参数执行某些操作callback().问题是主脚本不能等待外部PHP脚本完成.外部脚本的结果很重要,因此exec('php -f file.php &')不是一个选项.
编辑:许多人建议看看PCNTL,所以似乎可以实现这样的功能.PCNTL在Windows中不可用,我现在无法访问Linux机器,所以我无法测试它,但如果有这么多人建议它,那么应该这样做:)
感谢大家!
Chr*_*ris 12
在Unix平台上,您可以启用PCNTL功能,并用于pcntl_fork分叉进程并在子进程中运行作业.
就像是:
function fast_call_user_func_array($func, $args) {
if (pcntl_fork() == 0) {
call_user_func_array($func, $args);
}
}Run Code Online (Sandbox Code Playgroud)
一旦调用pcntl_fork,两个进程将从同一位置执行您的代码.父进程将获得从中返回的PID pcntl_fork,而子进程将获得0.(如果父进程将返回错误-1,则值得在生产代码中检查).