PHP中的多线程编程,以避免运行时限制

时间:2009-09-09 15:22:47

标签: php multithreading

我知道PHP不是多线程的,但我和朋友谈过这个:如果我有一个很大的算法问题,我想用PHP解决不是简单地使用“curl_multi_xxx”接口并启动n个HTTP请求的解决方案在同一台服务器上。这就是我称之为PHP风格的多线程。

在典型的网络服务器环境中,这有什么问题吗?等待“curl_multi_exec”的主请求不应该计算任何时间与其最大运行时间或内存长度。

我从来没有在任何地方看到过将其作为一种解决方案来防止脚本因PHP限制性太强的管理设置而被杀死。

如果我将这个功能添加到一个流行的PHP系统中,是否会有服务器管理员雇用一名俄罗斯黑手党杀手来报复这个黑客攻击?

4 个答案:

答案 0 :(得分:5)

  

如果我将此作为功能添加到   流行的PHP系统会有   服务器管理员雇用俄罗斯黑手党   杀手为这个黑客报仇?

没有,但除了PHP应该渲染网页之外没有别的原因,这仍然是一个可怕的想法。没有运行大算法。我看到人们一直试图在ASP.Net中这样做。有两个正确的解决方案。

  1. 让您的PHP脚本生成一个进程 独立于网络运行 服务器并更新公共数据 存储(可能是一个数据库) 有关进展的信息 PHP脚本可以执行的任务 访问。
  2. 有一个持续运行的守护进程 检查共同的工作 PHP脚本可以存储的数据存储 发布工作并查看进度 当前正在运行的工作。

答案 1 :(得分:2)

通过使用curl,您将在混合中添加网络超时依赖性。理想情况下,您可以从命令行运行所有内容以避免超时问题。

PHP支持分叉(pcntl_fork)。您可以分叉一些进程,然后使用pcntl_waitpid之类的东西监视它们。您最终会有一个“父”进程来监视它所跨越的子进程。 请记住,虽然一个进程可以启动,加载所有内容,然后fork,您无法共享数据库连接等内容。所以每个分叉的进程都应该建立自己的进程。我已经使用了50个进程。

如果你的PHP安装没有forking,你可以像Spencer提到的那样产生一个进程。只需确保以不会停止处理主脚本的方式生成进程。您还希望获取进程ID,以便监视生成的进程。

exec("nohup /path/to/php.script > /dev/null 2>&1 & echo $!", $output);
$pid = $output[0];

您还可以使用上面的exec()设置来生成从网页启动的进程并立即获得控制权。

答案 2 :(得分:1)

出于好奇 - 你的“大算法问题”试图完成什么?

您可能最好将其编写为Amazon EC2服务,然后销售对服务的访问权限而不是包本身。

编辑:您现在提到“群发电子邮件”。已有服务这样做,他们通常被称为“垃圾邮件发送者”。请不要。

答案 3 :(得分:0)

洛萨,

据我所知,php不支持服务,就像他的concorrent一样,所以你没有办法让php知道已经过了多少时间,除非你经常打断流程来检查时间传递..所以,imo,不,你不能在php中做到这一点:)