Невозможно получить эхо-ответ для браузера из-за долгого запуска PHP-скрипта на сервере ubuntu 16.04 с apache 2.4.18 и PHP 7.2 - PullRequest
0 голосов
/ 29 мая 2019

Привет, у меня есть этот 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. У вас есть идеи, почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...