2012-12-10 88 views
7

我目前正试图从可用的内容生成demenad上的epub。 不幸的是,当epub的内容很多时,http请求完成需要一段时间(有些情况下需要10分钟) - 这并不理想PHP - 长时间运行的后台任务

我想遵循类似于Safari的方法 - 当文件可生成一个EPUB和向用户发送电子邮件

我的问题是 - 什么是在PHP中运行一个后台任务/线程可能需要很长一段时间的最佳方式来完成

+1

请注意,如果您位于共享网络主机上,则主机可能不允许脚本长时间执行。因此,您可能需要将工作分解(如果可能)。 –

回答

16

对于长时间运行的PHP进程,您需要小心谨慎,因为对于一个PHP来说内存效率不高(例如PHP中只有100个int的数组可能会消耗多达15KB的内存)。对于99%的用例来说,这通常很好,因为大多数人只是使用PHP来访问网站,而且这些进程只运行几分之一秒,所以内存因速度而牺牲了。但是,对于一个长期运行的过程(特别是如果你有很多这样的过程),这可能不是你最好的解决方案。

您还希望非常小心地在PHP中调用exec/shell_exec类似函数,因为它们在内部实现为流(即它们可能会导致父进程中的阻塞,因为它通常必须等待流返回数据)。

背景任务的一个选项是使用fork。不过,我强烈建议使用像gearman(也参见php extensions)或像amqpzmq这样的队列的正确工作管理器,以更清楚地处理这些任务。哪一个更适合你的用例,我会让你决定。

1

可以运行命令

$command = 'nohup >/dev/null 2>&1 /your/background/script.php &'