Непонятная блокировка сессий разными страницами

MVH

Новичок
Непонятная блокировка сессий разными страницами

Лучше тему сформулировать не смог :)
Ситуация такая. Есть 3 файла:

.htaccess
Код:
php_flag session.use_cookies on
page1.php
Код:
[PHP]<?php
session_start();

print '<body>begin';
sleep(20);
print 'end';
?>[/PHP]
page2.php
Код:
[PHP]<?php
print date('H:i:s') . '<br>';
session_start();
//дальше программа продолжит выполнение только тогда, когда завершит работу page1.php,
//если он был предварительно запущен или, если в htaccess session.use_cookies отключить.
print date('H:i:s') . '<br>';
?>[/PHP]

Запускаем page1.php, следом, в другом окне/вкладке запускаем page2.php. И page2.php будет работать 20 секунд... :) Что за глюк?

Это у меня на WIN XP, Apache 2.2.4, PHP 5.2.4
Сейчас нет возможности на более свежей версии php опробовать, может кто протестит?
 

Farsh

~ on ~ high ~ wave ~
Все нормально, так и должно быть. Оба файла работают с одним и тем же файлом сессий, который при запуске первого скрипта открывается - блокируется - закрывается после окончания работы. Следовательно второй скрипт не сможет работать с сессией, пока первый не завершит свою работу. Поэтому нужно самому закрывать тот самый файл при помощи session_write_close().
 

MVH

Новичок
Помогло, спасибо Вам, что помогли разобраться!

-~{}~ 14.08.09 22:43:

Боже мой! Farsh, спасибо Вам огромное. Я уже вторые сутки бьюсь над проблемой с перекодированием видео, я уже проверял, может exec или proc_open подвисают где-то, перекопал крон конвертер, копался в JS интерфейсе и т.п. Но мне и в голову не могло прийти, что это долгоработающий конвертер блокирует файл сессии и не даёт делать AJAX запросы другим скриптам. Как же я счастлив :) УРА УРА УРА!!!! Спасибо Вам ещё раз!!!! Наконец-то, сегодняшнюю ночь мой мозг будет спать спокойно. :)
 

MVH

Новичок
Ещё обнаружил, что если вызвать один и тот же скрипт (именно с одним и тем же URL адресом) в Firefox (может и в других браузерах) несколько раз одновременно (в разных вкладках), то браузер ставит вызовы в очередь, а не вызываем их все сразу.
Например, одновременно вызываем следующий скрипт несколько раз:
PHP:
<?php
print date('H:i:s');
sleep(10);
?>
/test.php
/test.php
/test.php

Время будет выведено разное, с интервалом в 10 секунд, но если вызвать:
/test.php
/test.php?2
/test.php?3

То время все выведут одинаковое.

P.S.: это так, наткнулся на это недопонимания во время тестирования перекодировщика, провозившись часок-другой впустую. Может кому поможет... :(
P.P.S.: теперь мой мозг полностью расслаблен и готов ко сну. Всем спасибо, спокойной ночи. :eek:
 

dimagolov

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

но трудно мне представить когда имеет смысл одновременно слать одни и те же запросы...
 

MVH

Новичок
dimagolov, говорил же, тестил скрипт для перекодирования видео, который потом по крону будет запускаться. Запустил, например 5 скриптов и каждый в бесконечном цикле выбирает видео для перекодирования, пока есть что перекодировать. И одновременно перекодируется 5 видео файлов.

-~{}~ 15.08.09 12:31:

Автор оригинала: dimagolov
его поведение не лишено логики. нафига долбить один и тот же запрос, если такой уже был послан, но ответа на него не получено? в зависимости от полученного результата остальные может и не понадобиться посылать (отдадим результаты первого) или таки придется запросить еще раз (если результат не кешируется).
Думаю, бразер никак уж не может интерпретировать результат скрипты и решать посылать следующие запросы или нет. Вообще на баг больше похоже.

Автор оригинала: dimagolov но трудно мне представить когда имеет смысл одновременно слать одни и те же запросы...
Пример уже привёл, могу ещё: скрипт выбирает рандомно анектод из базу удалённого сервера (тормознутого) и я хочу сраз 3 анектода почитать.
 

Adelf

Administrator
Команда форума
зачем вам session_start(); в скрипте для работы с крона? Даже если просто тестить его.
 

MVH

Новичок
P.S.: такое же поведение похоже и в Opere. В IE7 - НЕТ

-~{}~ 15.08.09 12:39:

Автор оригинала: Adelf
зачем вам session_start(); в скрипте для работы с крона? Даже если просто тестить его.
Он мне не нужен, просто подключался init.php скрипт, где попимо всего прочего и необходимого для крон-скрипта и сессия при необходимости стартовала. Считайте, что это был баг.
 

dimagolov

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

MVH

Новичок
dimagolov, блин, так я же и говорил, что тестировал через браузер. Так быстрее, нежели заливать за unix сервер (я то на винде) и в кроне прописывать. И просто "для страждущих" заметку оставил. Да и перекодировщик, я считаю должен быть максимально лоялен к параллельным вызовам, вне зависимости от способа запуска.

P.S.: в итоге, кстати, от запуска по крону отказался. Запускаю перекодировщик неблокирующим вызовом сразу после закачки видео. Скрипт закачки успешно завершает работу, а в фоновом режиме сразу же перекодировка началась (естественно ограничение на кол-во одновременно работающих процессов поставил).
 

dimagolov

Новичок
(естественно ограничение на кол-во одновременно работающих процессов поставил).
и что с теми, которым не хватило места? юзер получает отлуп?

-~{}~ 15.08.09 17:38:

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

MVH

Новичок
Автор оригинала: dimagolov
и что с теми, которым не хватило места? юзер получает отлуп?
Их перекодируют оставшиеся рабочие процессы, которые работают в бесконечном цикле, пока есть что перекодировать. Плюс пару раз в сутки для перестраховки можно и по крону запустить.

P.S.: разговор уже ни о чём пошёл. Тему уже давно пора закрывать.
 

Adelf

Administrator
Команда форума
Ну если бы ты сюда не ответил, то она так бы и осталась внизу и закрылась бы сама собой...
 

MVH

Новичок
Adelf, а если бы ещё и такой умник как ты не нафлудил, то тогда бы она точно осталась внизу и закрылась бы сама собой.
 
Сверху