【问题标题】:Scaling curl with php and cron使用 php 和 cron 缩放 curl
【发布时间】:2017-02-27 18:27:18
【问题描述】:

我正在尝试使用 PHP 创建一个网站监控 webapp。目前,我正在使用 curl 收集来自不同网站的标头,并在网站状态发生变化时更新 MySQL 数据库(例如,如果“启动”的网站变为“关闭”)。

我正在使用 curl_multi(通过我稍微调整的 Rolling Curl X 类)并行处理 20 个站点(这似乎给出了最快的结果)和 CURLOPT_NOBODY 以确保只收集标题并且我已经尝试简化脚本以使其尽可能快。

它工作正常,我可以在大约 40 个网站上处理。 2-4 秒。我的计划是每分钟通过 cron 运行脚本......所以看起来我每分钟能够处理大约 600 个网站。虽然目前还可以,但从长远来看是不够的。

那么我该如何扩展呢?是否可以并行运行多个 cron,或者这会遇到瓶颈问题吗?

我突然想到我可以将数据库分成 400 个组并为这些组运行单独的脚本(例如 ids 1-400、401-800、801-1200 等可以单独运行脚本),因此不会有数据库损坏的危险。这样每个脚本都将在一分钟内完成。

但是感觉这可能行不通,因为运行 curl_multi 的一个脚本似乎在 20 个并行请求时最大限度地提高了性能。那么这会奏效还是有更好的方法?

【问题讨论】:

    标签: php curl cron scaling


    【解决方案1】:

    是的,简单的解决方案是使用相同的 PHP CLI 脚本并传递参数 1 和 2,即表示处理包含每个站点信息的 db 记录的最小和最大范围。

    例如。 crontab 列表
    * * * * * php /user/script.php 1 400
    * * * * * php /user/script.php 401 800

    或者使用单个脚本,您可以触发多线程(在 PHP 中使用 pthreads 进行多线程)。但是cron间隔应该以完成800个站点为基准。

    参考:How can one use multi threading in PHP applications

    例如。脚本多线程在 3 分钟内完成 然后将区间设为 */3。

    【讨论】:

    • 谢谢 - 这是一个很大的帮助。我不认为我可以使用 pthreads,因为“pthreads 扩展不能在 web 服务器环境中使用”而且这是在 webserver 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多