我在 Firefox Web 浏览器中本地运行一个 php 脚本。300 秒后,我收到一个错误页面。“加载页面时出现问题。连接已超时。本地服务器响应时间过长。”脚本仍在运行,但我觉得它运行速度非常慢。
假设:Apache 超时是导致错误页面的原因(因为它设置为 300)。但我不明白为什么会发生这种情况。这不是我第一次运行需要很长时间的 php 脚本。有时我的脚本会运行几天。这个特定的脚本正在从 InnoDB 表(350k 条记录)读取出版数据,并用分号拆分作者。然后将这些作者姓名写回到另一个表中。
简单地增加超时并不是解决办法。我需要修复导致超时的任何原因。毫无疑问,这也是我的脚本运行如此缓慢的原因。
我找到了插入速度慢的原因:由于我使用的是 InnoDB,所以我应该将插入包装在事务/提交中。
超时的可能原因是:在 Unix 中指定 127.0.0.1 将使用 TCP/IP 而不是 UNIX 套接字。
在http://httpd.apache.org/docs/2.2/mod/core.html#timeout我读到“TimeOut 指令定义了 Apache 在各种情况下等待 I/O 的时间长度:从客户端读取数据时,如果读取缓冲区为空,则等待 TCP 数据包到达的时间长度。将数据写入客户端时,如果发送缓冲区已满,则等待数据包确认的时间长度。[...]”。
我将非常感激任何形式的帮助,例如查看特定日志文件或运行特定命令以获取更多信息的说明。据我所知,Apache 超时与互联网流量有关,但我没有连接任何东西,所以……好吧,我迷路了。谷歌也帮不上忙。
一些环境信息:
- PHP 5.3.10-1ubuntu3.11 带有 Suhosin-Patch (cli)(构建于:2014 年 4 月 4 日 01:30:04)
- mysql Ver 14.14 Distrib 5.5.37,适用于 debian-linux-gnu (x86_64),使用 readline 6.2
- Ubuntu 12.04.4 LTS,3.5.0-51-通用
- FRITZ!Box Fon WLAN 7360,FRITZ!OS 06.04
- LAN 2 为 100 Mbit/s(绿色模式,而不是 1 Gbit/s 电源模式)
我使用了 125.9 GiB 内存中的 12.0 GiB。无交换。平均负载约为 2.3。还有 1.9 TiB 可用磁盘空间。
到目前为止我已经尝试过:
- 我的浏览器中的“离线工作”
- 转到
127.0.0.1
而不是本地主机 - 在 httpd.conf 中我将 ServerName Localhost 更改为
127.0.0.1:80
- 在 php 脚本中,首先检索所有数据,关闭结果集,然后从数组开始工作。
每当我对配置文件进行更改时,我都会重新启动 apache2 和 mysql。
PHP脚本:
set_time_limit( 0 );
ini_set( 'display_errors', 1 );
ini_set( 'memory_limit', '4G' );
error_reporting( E_ALL|E_STRICT );
$mysqli = new mysqli( 'localhost', 'root', 'mypassword', 'WoS_Mexico_1990-2014' );
if ( $mysqli ) {
$sql = 'SELECT `ID`, `AU`, `AF`, `C1`, `RP`, `EM`, `RI`, `OI` FROM `WoS`;';
if ( $result = $mysqli->query( $sql ) ) {
while ( $row = $result->fetch_assoc() ) {
// do some things such as explode strings into arrays
$sql = 'INSERT INTO ...';
$mysqli->query( $sql );
}
$result->close();
}
$mysqli->close();
}
我有跳过名称解析在 my.cnf 中。
在类似的主题中,有人发布了 netstat 结果,因此这是我的。
daigu@Jiriki:~$ sudo netstat -plnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 7423/mysqld
tcp 0 0 127.0.0.1:5939 0.0.0.0:* LISTEN 2256/teamviewerd
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 2281/dnsmasq
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1247/cupsd
tcp6 0 0 :::80 :::* LISTEN 7390/apache2
tcp6 0 0 ::1:631 :::* LISTEN 1247/cupsd
mysqld 使用 tcp,而 apache2 使用 tcp6。这有问题吗?
查看各种日志文件,我注意到我也受到了 UFW 垃圾邮件的困扰。
6月7日 13:34:29 Jiriki 内核:[88803.827685] [UFW BLOCK] IN=eth1 OUT= MAC=01:00:5e:00:00:01:08:96:d7:af:89:26:08:00 SRC=192.168.178.1 DST=224.0.0.1 LEN=36 TOS=0x00 PREC=0xC0 TTL=1 ID=0 DF PROTO=2
daigu@Jiriki:/var/log$ sudo ufw status verbose 状态:活动 日志记录:开启(低) 默认:拒绝(传入),允许(传出) 新配置文件:跳过
此外,apache2/error.log 也相当大。最后一行是:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/http.so' - /usr/lib/php5/20090626/http.so: cannot open shared object file: No such file or directory in Unknown on line 0
[2014 年 6 月 6 日星期五 19:32:12] [通知] Apache/2.2.22 (Ubuntu) PHP/5.3.10-1ubuntu3.11 已配置 Suhosin-Patch — 恢复正常运行
但这似乎是一个老问题,2 月 16 日首次出现。
超时不再发生,尽管 - 据我所知 - 我没有对任何配置文件进行任何更改。
回答 Braiam 的问题:Apache 日志中没有任何内容表明存在配置错误。一切都运行正常,即使我的浏览器显示超时,php 脚本实际上仍会继续运行(应该如此)。