Привет, у меня есть этот php-скрипт для прогрессивной загрузки файла с помощью curl ftp:
set_time_limit(0);</p>
<p>if(isset($_POST['host'])) $ftp_server = $_POST['host'];
if(isset($_POST['port'])) $ftp_port = $_POST['port'];
if(isset($_POST['utente'])) $ftp_username = $_POST['utente'];
if(isset($_POST['pwd'])) $ftp_userpass = $_POST['pwd'];
if(isset($_POST['folder'])) $ftp_folder = $_POST['folder'];
if(isset($_POST['file'])) $ftp_file = $_POST['file'];
if(isset($_POST['local'])) $ftp_local = $_POST['local'];
if(isset($_POST['uuid'])) $ftp_uuid = $_POST['uuid'];</p>
<p>if(isset($_GET['host'])) $ftp_server = $_GET['host'];
if(isset($_GET['port'])) $ftp_port = $_GET['port'];
if(isset($_GET['utente'])) $ftp_username = $_GET['utente'];
if(isset($_GET['pwd'])) $ftp_userpass = $_GET['pwd'];
if(isset($_GET['folder'])) $ftp_folder = $_GET['folder'];
if(isset($_GET['file'])) $ftp_file = $_GET['file'];
if(isset($_GET['local'])) $ftp_local = $_GET['local'];
if(isset($_GET['uuid'])) $ftp_uuid = $_GET['uuid'];</p>
<p>if(isset($argc))
{
$ftp_server=$argv[1];
$ftp_port=$argv[2];
$ftp_username=$argv[3];
$ftp_userpass=$argv[4];
$ftp_folder=$argv[5];
$ftp_local=$argv[6];
$ftp_file=$argv[7];
$ftp_uuid=$argv[8];
}</p>
<p>$total_size=0;
$path=$ftp_local."/".$ftp_file;</p>
<p>try {</p>
<pre><code>file_put_contents(sys_get_temp_dir().'/'.$ftp_uuid,'run');
if(isset($ftp_uuid)) {
$xmldata = new SimpleXMLElement("<downloads></downloads>");
$cs = $xmldata->addChild('download','');
$cs->addChild('folder',dirname($ftp_folder));
$cs->addChild('file','');
$cs->addChild('totalsize',"-1");
$cs->addChild('size',"0.0");
$cs = $xmldata->addChild('download','');
$cs->addChild('folder',dirname($ftp_folder));
$cs->addChild('file',$ftp_file);
$cs->addChild('totalsize',0.0);
$cs->addChild('size',"0.0");
if(""===session_id()){
session_start();
}
$_SESSION[$ftp_uuid]=$xmldata->asXML();
session_write_close();
}
$url="ftp://".$ftp_username.":".$ftp_userpass."@".$ftp_server.":".$ftp_port.$ftp_folder;
if (file_exists($path))
{
unlink($path);
}
$fp = fopen ($path, 'w');
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false );
curl_setopt( $ch, CURLOPT_PROGRESSFUNCTION, 'progress' );
curl_setopt( $ch, CURLOPT_NOPROGRESS, false );
curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 100 );
curl_setopt( $ch, CURLOPT_FILE, $fp );
curl_exec( $ch );
curl_close( $ch );
fclose( $fp );
$result=array("status"=>"done","uuid"=> $ftp_uuid ,"folder" => $ftp_folder,"local" => $ftp_local,"file" => $ftp_file);
$jsonlist=json_encode($result,JSON_UNESCAPED_SLASHES);
$fout = fopen('php://output', 'w');
fwrite($fout, $jsonlist);
fclose($fout);
//echo $jsonlist;
</code>
} catch (исключение $ e) {
$ error_result = "Ошибка:". $ E-> GetMessage ();
$ result = array ("status" => $ error_result, "uuid" => $ ftp_uuid, "folder" => $ ftp_folder, "local" => $ ftp_local, "file" => $ ftp_file);
$ Jsonlist = json_encode ($ результат, JSON_UNESCAPED_SLASHES);
$ fout = fopen ('php: // output', 'w');
fwrite ($ fout, $ jsonlist);
fclose ($ FOUT);
//echo $jsonlist;
}
прогресс функции ($ ресурс, $ download_size, $ загружен, $ upload_size, $ загружен)
{
глобальный $ total_size;
global $ xmldata;
global $ ftp_folder;
глобальный $ ftp_file;
глобальный $ ftp_uuid;
$total_size+=$download_size;
foreach( $xmldata->xpath("download") as $c ) {
if(($c->folder == dirname($ftp_folder)) && ($c->file == $ftp_file))
{
$c->size=$total_size;
$c->totalsize=$downloaded;
}
}
session_start();
$_SESSION[$ftp_uuid]=$xmldata->asXML();
session_write_close();}
и в apache php.ini у меня есть:
max_execution_time = 600
max_input_time = -1
memory_limit = -1
error_reporting = E_ALL
display_errors = On
Проблема в том, что, если я загружаю большой файл от 1 до 6 ГБ, когда он завершает работу сценария без ошибок и файл был передан правильно, я не получаю никакого вывода в браузер.
Но если я запускаю тот же скрипт по php cli с тем же файлом, я получаю вывод в stdout.
У вас есть идеи, почему?