2013-02-19 2 views
0

Я использую CURL для загрузки большого файла с внешнего URL и сохранения его на моем сервере. Это может занять до нескольких минут. Хотя загрузка работает Я использую curl_setopt ($ ч, CURLOPT_PROGRESSFUNCTION .. запускать анонимную функцию, которая периодически обновляет свой $ _SESSION переменной [ «»] download_progress с текущей информацией загрузки.PHP: Как использовать сеанс на одной странице при загрузке другой страницы с sesson

Теперь все это происходит в upload.php файле и в то время как пользователь ждет файла для загрузки я использовать JavaScript для запроса progress.php страница, которая содержит следующий простой код:

session_start(); 
echo $_SESSION['download_progress']; 

Это позволяет мой Javascript код для отображения информации о

Кроме того, что это не работает ,

Страница «progress.php» не загружается, пока «upload.php» не закончит загрузку (другими словами, обе страницы загружаются только после завершения загрузки файла), и это нехорошо. Функция session_start() каким-то образом блокирует загрузку страницы «progress.php». Я использую свой собственный сервер (apache + php 5.4), поэтому у меня есть все права администратора.

Как я могу решить эту проблему? Я мог бы использовать некоторое уродливое обходное решение, например, записывать информацию загрузки в файл txt вместо переменной сеанса, а затем использовать javascript для прямого чтения этого txt-файла, но я бы этого не хотел.

Благодаря

+0

Насколько я знаю, что вы должны работать, если оба файла не вызывают из того же файла. Если, например, у вас есть index.php? Some_setting_to_load_upload.php и index.php? Some_setting_to_load_progress.php Вы тестировали его онлайн, чтобы узнать, есть ли у вас другой результат? –

ответ

3

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

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

Чтобы освободить сеанс блокировки, позвоните session_write_close в любой точке вашего сценария загрузки. Это оставляет вас без доступа к переменным сеанса до тех пор, пока вы снова не вызовете session_start. Вы можете повторить этот цикл столько, сколько хотите.

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

+0

Отлично, это именно то, что мне нужно. – user2079305

+0

Полезная пояснительная информация. – Edward

+0

Другие люди упомянули об этом, и хорошо, автор этого ответа указал на это. Другим источником информации является http://php.net/manual/en/function.session-start.php#101452, которая ссылается на описание по адресу http: // konrness.com/php5/how-to-prevent-blocking-php-requests/ – Edward

Смежные вопросы