我有一个PHP脚本,可以通过FTP连接到远程服务器,以递归方式下载所有内容,并将文件添加到MySQL数据库中。
我遇到的问题是,它总是在不同的时间后停止。它们是通话录音,所以有很多。文件夹结构看起来有点像这样:
|/
|¬merged
|¬20150105
|¬Time-20150105-091444-From-2244605-To-2244615.wav
|¬20150106
|¬Time-20150105-091444-From-1234567-To-1236547.wav
等等…(显然每个文件中有多个文件…(
以下是FTP脚本:
<?php
include('../includes/init.php');
$ftp_server = "ftp1.FTPSERVER.com";
$conn_id = ftp_connect ($ftp_server)
or die("Couldn't connect to $ftp_server");
$login_result = ftp_login($conn_id, "USER", "PASSWD");
if ((!$conn_id) || (!$login_result))
die("FTP Connection Failed");
ftp_pasv($conn_id, false);
ftp_sync ("."); // Use "." if you are in the current directory
ftp_close($conn_id);
// ftp_sync - Copy directory and file structure
function ftp_sync ($dir) {
global $conn_id, $core;
if ($dir != ".") {
if (ftp_chdir($conn_id, $dir) == false) {
echo ("Change Dir Failed: $dir<BR>rn");
return;
}
if (!(is_dir($dir)))
mkdir($dir);
chdir ($dir);
}
$contents = ftp_nlist($conn_id, ".");
foreach ($contents as $file) {
if ($file == '.' || $file == '..')
continue;
if (@ftp_chdir($conn_id, $file)) {
ftp_chdir ($conn_id, "..");
ftp_sync ($file);
}
else
ftp_get($conn_id, $file, $file, FTP_BINARY);
$core->addFile('3', $file);
}
ftp_chdir ($conn_id, "..");
chdir ("..");
}
?>
我通过shell运行这个脚本,以避免PHP的最大执行时间。
addFile函数只需读取文件名并将其放置在DB中的新行中。
如果有帮助,CLI会输出以下内容。。。
警告:ftp_get((:1.763秒(此处测量(,第43行/home/user/web/domain.com/public_html/test/ftp.php中每秒2.57兆字节PHP警告:ftp_get((:1.763秒(此处测量(,在第43行的/home/user/web/domain.com/public_html/test/ftp.PHP中每秒2.57兆字节
警告:ftp_get((:1.763秒(此处测量(,第43行/home/user/web/domain.com/public_html/test/ftp.php中每秒2.57兆字节PHP警告:ftp_chdir((:1.763秒(此处测量(,在第47行的/home/user/web/domain.com/public_html/test/ftp.PHP中每秒2.57兆字节
非常感谢您的帮助。
增加php.ini文件中的脚本执行时间。这可能会解决你的问题。或第220个文件上的文件名可能存在一些错误,该文件将停止执行您的脚本。OR增加内存限制
ini_set('memory_limit','1024M');
经过一段时间的调试,我发现问题实际上存在于$core->addFile()
函数中。
这是对每个文件运行MySQL查询,因此也是阻塞。MySQL连接最终超时,从而停止了脚本。
这个问题很难回答,因为我忽略了添加上面的addFile
函数。很抱歉
最终修复很简单。。。在/etc/my.cnf
中增加超时时间(可在CentOS上使用(。