2009-09-09 106 views
3

我知道PHP不是多线程的,但我与一个朋友谈到这个问题:如果我有一个大的算法问题,我想用PHP解决并不是简单地使用“ curl_multi_xxx“接口,并在同一台服务器上启动n个HTTP请求。这就是我称之为PHP风格的多线程。在PHP中的多线程编程,以避免运行时限制

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

我从来没有见过这个任何地方促进作为一种解决方案,以防止脚本被PHP限制性管理设置杀死。

如果我把它作为一个功能添加到流行的PHP系统中,服务器管理员会雇佣俄罗斯黑手党杀手来为这种黑客报复?

+0

这个技巧是否也可以让一个'线程'继续,而主要的PHP页面已关闭?那将是真棒。这样可以尽快返回结果,然后做一些也需要完成的事情,但不希望让用户等待。 – Toad 2009-09-09 15:30:36

+1

只要你不需要有'线程'相互沟通,可能工作。但是:你想在PHP中解决什么样的大算法探针?即为什么在PHP中? ^^ – KB22 2009-09-09 15:31:39

+0

这是一个导入数据任务并发送大量电子邮件,这是严重的,因为MTA连接有很长时间的延迟。为什么我想这样做?那么世界似乎运行在PHP上的一切,所以它是最大的赚钱市场 – Lothar 2009-09-09 16:07:30

回答

0

洛萨,

据我所知,PHP不与服务工作,像他concorrent,所以你没有办法让PHP能知道,除非你不断多少时间已经过去了中断过程中,检查经过的时间。所以,国际海事组织,不,你不能这样做,在PHP :)

+0

我不明白你的答案。但我很确定PHP只计算脚本终止计算的实时时间,而不计算时间。 – Lothar 2009-09-09 16:21:08

5

如果我添加为特征划分为 流行的PHP系统会不会有 服务器管理员雇用俄罗斯黑手党杀手为这次黑客报复?

没有,但它是一个可怕的主意,除了PHP应该呈现网页之外没有别的原因。不运行大算法。我看到有人试图在ASP.Net中一直这样做。有两个适当的解决方案。

  1. 让你的PHP脚本生成一个进程 独立于网络 服务器的运行,并提供有关的 其进度的任务 信息更新的通用数据 存储(可能是一个数据库),你的PHP脚本可以 访问。
  2. 有一个共同的 数据存储的PHP脚本可以 问题的工作并查看当前运行的作业进度 检查工作不断运行的守护 。
2

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

PHP支持分叉(pcntl_fork)。你可以分叉一些进程,然后用pcntl_waitpid这样的东西来监视它们。你最终得到一个“父母”过程来监视它跨越的孩子。 请记住,虽然一个进程可以启动,加载所有内容,然后分叉,但不能共享数据库连接等内容。所以每个分支进程都应该建立它自己的进程。我已经使用了50多道工序。

如果分支不适用于您的PHP安装,您可以像斯宾塞提到的那样产生一个流程。只要确保以不停止处理主脚本的方式产生进程。您还希望获得进程ID,以便您可以监视生成的进程。

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

您也可以使用上面的exec()设置产卵的过程从网页开始,后立即得到控制。

+0

这不是关于我。我正在写一个罐头解决方案,可以让数千名客户在最便宜的托管服务提供商上运行hunderts。我简直不能认为他们有权做任何事情,然后在机器上运行php。而且很多人都有很短的时间限制。例如,我已经看到了15秒。对于数据处理后台任务来说,这只是问题。 – Lothar 2009-09-09 16:19:40

+0

我在$ 10 /月的共享服务器和四核专用服务器上使用了这种类型的解决方案。我只是参数化将生成的进程的数量,以便向上或向下扩展。 – 2009-11-29 17:37:58

1

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

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

编辑:你现在提到“群发邮件”。已经有服务可以做到这一点,他们通常被称为“垃圾邮件发送者”。请不要。

+0

即使是小公司也会为客户提供10000双双倍选择。这并不难。 – Lothar 2009-09-09 17:38:07