我有一个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>\r\n");
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函数只读取文件名并将其放在数据库的新行中。
如果有帮助,CLI会输出这个......
警告:ftp_get():1.763秒(此处测量),第43行/home/user/web/domain.com/public_html/test/ftp.php中每秒2.57 MB PHP警告:ftp_get():1.763秒(此处测量),第43行/home/user/web/domain.com/public_html/test/ftp.php中每秒2.57 MB
警告:ftp_get():1.763秒(此处测量),第43行/home/user/web/domain.com/public_html/test/ftp.php中每秒2.57 MB PHP警告:ftp_chdir():1.763秒(此处测量),第47行/home/user/web/domain.com/public_html/test/ftp.php中每秒2.57 MB
非常感谢任何帮助。
答案 0 :(得分:1)
增加php.ini文件中的脚本执行时间。这可以解决您的问题。 要么 在第220个文件上可能存在与文件名相关的一些错误,该文件停止执行您的脚本。或者增加内存限制
ini_set('memory_limit','1024M');
答案 1 :(得分:-1)
经过一段时间的调试后,我设法确定问题实际上在addFile
函数中存在。
这是针对每个文件运行MySQL查询,因此阻止了。 MySQL连接最终超时,从而停止了脚本。
这个问题很难回答,因为我忽略了添加上面的/etc/my.cnf
函数。遗憾!
最后修复很简单......在{{1}}(在CentOS上)上调超时时间。