2013-08-20 27 views
0

我用exec()功能触发新的PHP的线程(而且不需要这些PHP脚本的输出),像EXEC替代触发多个新的PHP线程共享主机

for ($i=0;$i<5;$i++) { 
exec('/usr/bin/php script' . $i . '.php > /dev/null 2>&1 &'); 
sleep(1); 
} 

我d想询问是否有其他本地PHP功能可以完成同样的工作,因为我的虚拟主机提供商不启用exec,我不愿意切换到另一个。

非常感谢。

+0

'exec()'不会“触发php线程”。它开始完全独立的PHP解释器流程,这是一项非常昂贵的任务。 – arkascha

+0

其实我并不熟悉正确的术语,但该代码服务于我的目的(例如,script1.php,script2.php ...是脚本,需要运行直到完成,但我不需要显示输出,这些脚本中的任务也需要时间(几秒钟),但不是CPU饥饿) – aye

+0

请不要尝试多线程编程。 [主题是邪恶的](http://www.eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-1.pdf),虽然是必要的罪恶。 PHP不是(也不应该是)用于并发计算。这不仅仅是工作的正确工具。你可以让系统生成一个子进程,是的,你可以选择_not_来等待孩子的回应,但是回过头来问问自己:_“没有另一种方式吗?我真的需要线程/子进程?“_通常,答案是否定的... –

回答

0

通常这些任务是通过http服务器内部的请求产生的。只需使用phps [virtual()][1][curl extension][2]即可完成更复杂的任务。

然而,您仅限于phps web配置,因此请注意诸如执行超时等限制。我怀疑是否有办法在网络托管系统上产生真正的流程。这将是一个可怕的安全线程!

通常这些任务也被委托给某种作业调度程序实现,该作业调度程序实现由cron,poor mans cron或基于ajax的触发器触发。这意味着您必须为等待处理的作业实施调度程序。但它也带来了单独工作的良好分离。

+0

因此,简而言之,对于我来说,做同样的工作没有其他功能吗?我不想运行这些脚本(通过'include()'),因为它需要很长时间。每个脚本将消耗大约3-5秒,所以主机限制不会有任何问题。 – aye

+0

最有可能没有办法产卵另一个过程,但我上面描述的提供了几种替代方法。他们为什么不合适? – arkascha

+0

由于服务器每小时限制cron作业的数量,所以cron作业不是解决此特定问题的方法。不幸的是,我也不熟悉ajax。现在我要重新编码主要脚本来使用python,正如alex alex所建议的那样。感谢您的帮助 :) – aye