2011-01-19 108 views
2

我目前正在运行基于Linux的VPS,拥有768MB的RAM。如何避免此PHP脚本导致服务器停滞?

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

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

**(远程网页检索领域的详细信息,并通过AJAX更新页面,但直到加载完成卷曲请求犯规(理所当然)返回的页面。

谁能告诉我,如果我做任何明显错误的东西,或者是否有更好的方式(可以有10到10,000个域名排队等候,所以我需要一个可以在后台运行而不会影响其他站点的进程)

谢谢

+0

“没有别的东西似乎起作用”。只有其他的URL由PHP解析,或所有的URL(例如图片)? – goat 2011-01-19 17:32:48

+0

只是为了澄清 – thatguy 2011-01-19 18:50:14

+0

1)通过没有别的似乎功能我的意思是只有URL解析的PHP。图像加载没有问题。 – thatguy 2011-01-19 18:51:03

回答

3

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

因此,一旦你插入相关领域到数据库表中有“处理”标志设置为假,后台脚本,然后将:

  1. 扫描数据库为AREN域” t标记为已处理。

  2. 贯彻CURL查找等

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

    ...

为了确保与现有执行批处理脚本没有重叠,你应该只调用PHP脚本在cron中每五分钟(的PHP脚本本身内)检查多久脚本一直在“扫描”阶段开始运行,如果运行了四分钟或更长时间,脚本就会退出。 (你可能想调整这些数字,但希望你可以看到我要去哪里)

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

-1

我不确定你的代码结构如何,但你可以尝试使用sleep()。T帽子是我在批处理时使用的。

0

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

set_time_limit(0); 
flush(); 

这将允许PHP脚本继续运行,但它会将输出返回给用户。但严重的是,你应该使用批处理。它会给你更多的控制权。

0

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

我已经加载该网站在另一个浏览器(法郎),它加载得很好。

看来Chrome在域名服务器等待服务器响应时会对域进行某种锁定,并且我正在通过浏览器手动测试脚本。

感谢您的全力帮助,并遗憾地浪费您的时间。

CJ

0

虽然我与他人,你应该考虑处理这些任务,你的网络服务器之外,在更可控的方式同意,我会提供的“服务器瘫痪”的解释。

如果您使用的是本地php会话,php将使用独占锁定方案,因此一次只能有一个php进程处理给定的会话ID。长时间运行的使用会话的php脚本肯定会导致这种情况。

您可以搜索同类项的组合:
PHP会话并发锁session_write_close()

我敢肯定,它已经在这里讨论过很多次。我懒得找你。也许别人会来,并与项目符号清单和超级链接交换stackoverflow声誉:)但不是我:)

祝你好运。