我正在编写一个php脚本,它访问远程服务器上的csv文件,处理数据然后将数据写入本地MySQL数据库。由于要处理和插入数据库(50,000行)的数据太多,因此脚本运行时间超过60秒。我遇到的问题是,脚本在60秒后超时。
为了确保它不是MySQL问题,我创建了另一个进入无限循环的脚本,它在60秒时也超时。
我尝试在Ubuntu服务器上增加/更改以下设置,但没有帮助: 的max_execution_time max_input_time设置 mysql.connect_timeout default_socket_timeout apache2.conf文件中的TimeOut值。
可能是一个问题,因为我从网络浏览器访问PHP文件?网络浏览器是否有超时限制?
任何帮助都将不胜感激。
答案 0 :(得分:2)
克服此限制的最简单且最不具侵入性的方法是将此行添加到您的脚本中。
然后你只修改这个脚本的执行时间而不是所有PHP脚本,如果你修改了2个PHP.INI文件中的任何一个
ini_set ('max_execution_time', -1);
当您尝试修改php.ini
文件时,我猜您正在修改错误的文件,有2个,一个仅用于PHP CLI,另一个用于运行Apache的PHP。
为了将来参考找到php-apache使用的实际文件,只需做一个
<?php
phpinfo();
?>
寻找Loaded Configuration File
答案 1 :(得分:2)
我终于找到了请求超时的原因。问题在于虚拟服务器托管。
来自Web浏览器的请求被发送到托管服务器,托管服务器然后将请求定向到虚拟服务器(充当单独的服务器)。由于托管服务器在60秒后没有从虚拟服务器获得响应,因此它会超时并将响应发送回Web浏览器,说明这一点。同时,虚拟服务器仍在处理脚本。
当虚拟服务器最终完成处理脚本时,由于托管服务器已经向前端用户返回了超时错误,因此为时已晚。
由于托管服务器用于托管多个虚拟服务器(针对多个不同的用户),因此通常无法更改此服务器上的超时设置。
因此,最终判决:虚拟主机无法避免超时错误。如果这是一个严重的问题,您可能需要考虑获取专用服务器托管。
答案 2 :(得分:0)
迈克尔,
您的问题应该来自PHP文件,而不是访问它的Web浏览器。
您是否尝试在PHP文件的开头添加以下行?
set_time_limit(0);
ini_set ('max_execution_time', 0);
PHP有2个配置文件,一个用于Apache,一个用于CLI,这解释了为什么在命令行中运行脚本时,您没有超时。你给我的phpinfo有一个6000的max_execution_time
答案 3 :(得分:0)
对于CentOS8,以下设置对我有用:
sed -i 's/default_socket_timeout = 60/default_socket_timeout = 6000/g' /etc/php.ini
sed -i 's/max_input_time = 60/max_input_time = 30000/g' /etc/php.ini
sed -i 's/max_execution_time = 30000/max_execution_time = 60000/g' /etc/php.ini
echo "Timeout 6000" >> /etc/httpd/conf/httpd.conf
以常规方式重新启动Apache不再足够了。您必须立即执行以下操作:
systemctl restart httpd php-fpm
简介:
如果脚本(PHP函数)耗时61秒或以上,则将收到网关超时错误。术语网关被称为 PHP工作程序,这意味着工作程序超时,因为那是它的配置方式。与网络无关。
php-fpm是CentOS8中的一项新服务。根据我从互联网上收集的信息(我自己尚未对此进行验证),它基本上具有在后台运行的可执行文件(工作人员),等待您提供要执行的脚本(PHP)。节省时间是可执行文件始终处于运行状态。因为它们已经在运行,所以您不会遭受启动时间的损失。