Проблема с загрузкой PHP: неуспешный с медленной скоростью соединения - PullRequest
0 голосов
/ 21 октября 2019

Я застрял на этой проблеме в течение нескольких дней, и до сих пор не нашел решения, которое решает проблему, с которой я столкнулся.

Что я пытаюсь сделать:

Я пытаюсь использовать PHP для загрузки PDF-файлов, и код очень хорошо работает для файлов, которые можно загрузить в течение примернополторы минутыНа моем домашнем Wi-Fi я могу загрузить файл размером 159 МБ в течение 10 секунд, и он работает каждый раз. Но когда я ограничиваю скорость интернета до «Fast 3G» (около 170 КБ / с, чтобы имитировать более медленные офисные скорости), загрузка завершается неудачно. И почти каждый раз, когда процесс загрузки занимает ровно 3 минуты и 24 секунды, время от времени - 1 минута и 57 секунд.

Что я попробовал:

Я настроил файл php.ini (настройка max_execution_time = 0 и memory_limit с более высокими интервалами, чем изначально настроенные 128M)

Я пробовал другие методы загрузки, которые, кажется, "разбивают" на большие PDF-файлы. Это было в основном неудачно. В одном случае загрузка будет завершена, но при попытке открыть PDF-файл возникнет ошибка. По словам автора этого решения, это было только верное решение для файлов в кодировке UTF-8, и я обнаружил, что я имею дело с UTF-16. (Я полагаю, что это была какая-то несовместимость с функцией print ().

Я убедился, что файл можно загрузить, если использовать прямую ссылку в URL. У него нет проблем с этим, но это былосделано только для тестирования и не может быть постоянным решением, потому что PDF-файлы, с которыми я имею дело, содержат конфиденциальную информацию. Таким образом, основываясь на этом результате, я, по крайней мере, смог сузить проблему, связанную с PHP, а не с IIS.

Вот текущий код, который я использую

            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
            header("Content-Type: application/force-download");
            header("Content-Type: application/download");
            header('Content-Disposition: attachment; filename="'.basename($file).'"');
            header("Content-Transfer-Encoding: binary ");
            header('Content-Length: ' . filesize($file));
            //$file is a full path to the PDF

            while(ob_get_level()) {
                ob_end_clean();
            }
            readfile($file); 
            flush();

        exit;

        /*I realize it may be off, but it is at least working for quicker load 
        times as it currently is, so I'm leaving it alone for now*/

Я пытался включить любую информацию, которая показалась мне актуальной, но если какая-либо дополнительная информация будет полезна, пожалуйста, дайте мне знать! Я также буду уверен, чтовключите текущий код, который обрабатывает процесс загрузки, о котором я упоминал в верхней части поста.

1 Ответ

0 голосов
/ 21 октября 2019

Вместо

readfile($file); 
flush();

Я бы попробовал

$handle = fopen($file, 'r');
while (!feof($handle)) {
    echo fread($handle, 8192);
    flush();
}
fclose($handle);

. Возможно, вам придется настроить вышеуказанное для правильного кодирования, но это будет зависеть от вашей среды

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