如何避免此PHP脚本导致服务器停顿?

时间:2011-01-19 17:17:57

标签: php curl daemon

我目前正在运行基于Linux的VPS,拥有768MB的Ram。

我有一个应用程序,它收集域的详细信息,然后通过cURL连接到服务,以检索这些域的pagerank的详细信息。

当我对大约50个域进行检查时,在脚本可以解析详细信息并将其返回到我的脚本之前,需要使用所有结果加载远程页面大约3分钟。这会导致一个问题,因为在脚本执行完毕之前似乎没有任何其他功能,因此网站上的用户只需在等待页面加载时获得计时器/“死亡之球”。

**(远程页面检索域详细信息并通过AJAX更新页面,但curl请求不会(正确地)返回页面,直到加载完成。

任何人都可以告诉我,如果我做了任何明显错误的事情,或者是否有更好的方法。 (在10到10,000个域之间可以排队,因此我需要一个可以在后台运行而不影响网站其余部分的进程)

由于

5 个答案:

答案 0 :(得分:3)

更明智的方法是通过使用cron触发的PHP cli脚本“批处理”域数据。

因此,一旦您将相关域插入到“处理”标志设置为false的数据库表中,后台脚本就会:

  1. 扫描数据库以查找未标记为已处理的域。

  2. 执行CURL查找等

  3. 相应地更新数据库记录并将其标记为已处理。

    ...

  4. 为确保不与现有的正在执行的批处理脚本重叠,您应该每隔五分钟从cron调用一次php脚本,并且(在PHP脚本本身内)检查脚本在“扫描”开始时运行了多长时间“如果它已运行四分钟或更长时间,则退出并退出。 (你可能想调整这些数字,但希望你能看到我的目标。)

    通过使用这种方法,您将能够无限期地运行后台脚本(因为它通过cron调用,它将在重新启动后自动启动等)并且只需将域添加到数据库/查看结果通过单独的Web前端处理等。

答案 1 :(得分:0)

这不是理想的解决方案,但如果您需要根据用户请求触发此过程,则可以在脚本末尾添加以下内容。

set_time_limit(0);
flush();

这将允许PHP脚本继续运行,但它会将输出返回给用户。但严重的是,您应该使用批处理。它可以让你更好地控制正在发生的事情。

答案 2 :(得分:0)

首先,我很抱歉,但我是个白痴! :)

我已经在另一个浏览器(FF)中加载了该网站并且加载正常。

当Chrome等待服务器响应时,Chrome似乎会对某个域进行某种锁定,而我正在通过浏览器手动测试该脚本。

感谢您的所有帮助,抱歉浪费您的时间。

CJ

答案 3 :(得分:0)

虽然我同意其他人的观点,你应该考虑以更加可控的方式在网络服务器之外处理这些任务,但我会为“服务器停顿”提供解释。

如果你正在使用本机php会话,php使用独占锁定方案,因此一次只有一个php进程可以处理给定的会话ID。拥有一个使用会话的长时间运行的PHP脚本肯定会导致这种情况。

您可以搜索以下术语的组合:
php session concurrency lock session_write_close()

我确信这里已多次讨论过。我懒得去找你。也许其他人会出现并用项目符号列表和漂亮的超链接来回答stackoverflow声誉:)但不是我:))

祝你好运。

答案 4 :(得分:-1)

我不确定您的代码是如何构建的,但您可以尝试使用sleep()。这就是我在批处理时使用的。