Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用cron时MySQL的性能差异_Php_Mysql_Cron_Cpanel - Fatal编程技术网

Php 使用cron时MySQL的性能差异

Php 使用cron时MySQL的性能差异,php,mysql,cron,cpanel,Php,Mysql,Cron,Cpanel,我有许多使用cPanel在共享托管环境上运行的PHP维护脚本。大多数脚本需要每3-4小时运行一次,为了简化它们的执行,我编写了一个调度程序脚本,用于检查哪些脚本(如果有)需要运行,并在必要时执行它们。我在cron中将调度程序脚本设置为每5分钟运行一次。如果脚本发现当前没有到期的维护任务,则不会执行任何操作。调用调度程序的开销会导致执行大约5个简短的SQL查询(因此每5分钟执行一次) 一切正常,直到我的主机抱怨MySQL使用率高,声称我远远超出了允许的限制。禁用调度程序cron作业后,我的资源使用

我有许多使用cPanel在共享托管环境上运行的PHP维护脚本。大多数脚本需要每3-4小时运行一次,为了简化它们的执行,我编写了一个调度程序脚本,用于检查哪些脚本(如果有)需要运行,并在必要时执行它们。我在cron中将调度程序脚本设置为每5分钟运行一次。如果脚本发现当前没有到期的维护任务,则不会执行任何操作。调用调度程序的开销会导致执行大约5个简短的SQL查询(因此每5分钟执行一次)

一切正常,直到我的主机抱怨MySQL使用率高,声称我远远超出了允许的限制。禁用调度程序cron作业后,我的资源使用率降至0

  • 禁用cron作业之前:MySQL进程数(平均)-0.97
  • 禁用cron作业后:MySQL进程数(平均)-0.00
奇怪的是,在删除cron作业之后,我仍然每隔几个小时通过浏览器手动激活调度程序脚本。由于脚本仍在运行,我对MySQL进程的平均数量大幅下降感到非常惊讶。在禁用cron作业之前,我开始记录调度程序和维护脚本执行了多少SQL查询

  • 禁用cron作业之前:9899查询一天(平均)
  • 禁用cron作业后:每天9552次查询(平均)
因此,当我手动调用调度程序时,它执行的SQL查询数仍然几乎和cron一样多,但不知何故,我的MySQL使用率仍然降到了零


使用PHP命令通过cron作业执行PHP脚本与通过浏览器调用脚本之间是否存在性能相关的差异?我没有在脚本中显式关闭数据库连接,因为据我所知,这会在执行结束时自动发生。当脚本通过cron运行时,此连接是否可能保持打开状态?对于使用cron时的显著性能差异,还有什么其他解释呢?

通常,php旁边会安装两个
php.ini
文件:

  • 一个是Apache
  • 一个用于CLI(命令行界面)
通常,cron作业将执行
php-f yourfile.php
,它使用CLI
php.ini
文件。同样,当您通过网络和apache调用脚本时,它将使用apache
php.ini
文件。此外,apache允许在虚拟主机配置或
.htaccess
文件中使用
php\u值
php\u标志

您很可能在apache和CLI之间存在配置差异。

我首先想到的是持久的数据库连接。持久连接将使用到DB服务器的连接池,该连接池将在请求之间保持,即保持打开状态,以避免TCP握手。这是一种性能优化,但可以超过MySQL服务器的连接限制

在我的系统(Ubuntu)上,两个
php.ini
文件的路径如下:

  • /etc/php5/apache2/php.ini
  • /etc/php5/cli/php.ini

您可以通过
-c
标志指定在命令行上运行
php
时要使用的
php.ini
文件。

打赌您不是每5分钟从浏览器运行一次作业。不,我不是,但正如我上面所说的,每天执行的查询总数保持不变。也许每5分钟创建一次DB连接会带来很大的开销?也许你没有运行的347个查询是导致大部分负载的原因?如果通过cron运行脚本和通过浏览器请求运行脚本之间没有其他区别,那么你可能是对的。只是在大多数情况下,调度器脚本执行的唯一附加查询是一个不到100行的表上的简单select语句,因此它们不是长时间运行的查询。我还想知道cPanel提供的统计数据是否不太准确。你试过解释一下这些问题吗?而且平均在什么时期?5分钟?7小时?我无法访问共享托管环境中的默认php.ini文件,但我可以创建自己的并配置cron作业,以使用该文件,而不是使用您所说的-c标志。每5分钟运行一次作业似乎仍然会使我的MySQL资源使用量过载,但将MySQL.allow_persistent=“0”添加到我的自定义php.ini文件中肯定会有所不同。谢谢