我使用cPanel在共享主机环境上运行了许多PHP维护脚本。大多数脚本需要每3-4个小时运行一次,为了简化它们的执行,我编写了一个调度程序脚本,它检查这些脚本中哪些(如果有的话)需要运行,并根据需要执行它们。我将调度程序脚本设置为在cron中每5分钟运行一次。如果脚本发现当前未到期维护任务,则不执行任何操作。调用调度程序的开销导致大约5个简短的SQL查询被执行(因此这些查询每5分钟执行一次)。
一切都很好,直到我的主机抱怨MySQL使用率很高,声称我已经超出了允许的范围。禁用调度程序cron作业后,我的资源使用量下降到0。
奇怪的是,在删除cron作业之后,我仍然继续每隔几个小时通过浏览器手动激活调度程序脚本。由于脚本仍在运行,我对MySQL进程的平均数量急剧下降感到非常惊讶。在禁用cron作业之前,我开始记录调度程序和维护脚本执行了多少SQL查询。
因此,当我手动调用调度程序时,它执行的SQL查询仍然与cron一样多,但不知怎么的,我的MySQL使用量仍然下降到了零。
与通过浏览器调用PHP脚本相比,使用php命令通过cron作业执行php脚本在性能上有什么不同吗?我没有显式地关闭脚本中的数据库连接,因为我的理解是,在执行结束时会自动关闭数据库连接。当脚本通过cron运行时,这个连接是否可能保持打开?在使用cron时,还能有什么其他解释来解释巨大的性能差异呢?
发布于 2013-01-15 19:45:59
通常,两个php.ini文件与PHP一起安装:
通常,cron作业将执行php -f yourfile.php,后者使用CLI php.ini文件。同样,当您通过网络并通过apache调用脚本时,它将使用apache php.ini文件。此外,apache允许在虚拟主机配置或php_value文件中使用php_flag或php_flag。
您很可能在apache和CLI.之间有一个配置差异。
我脑海中浮现的第一件事就是持久的DB连接。持久连接将使用到您的DB服务器的连接池,这些连接将在请求之间持久化,即保持打开状态,以避免TCP握手。这是一个性能优化,但可以超过您的MySQL服务器的连接限制。
在我的系统(Ubuntu)上,这两个php.ini文件的路径如下:
/etc/php5/apache2/php.ini/etc/php5/cli/php.ini您可以指定在通过命令行通过php.ini标志运行php时要使用的-c文件。
https://stackoverflow.com/questions/14333255
复制相似问题