session_write_close() может стать твоим другом

    Однажды я столкнулся с такой проблемой: на странице сайта с помощью PHP-скрипта выдавался пользователю видео-контент (подробнее в моей статье «flash-видео на веб-страницах и PHP»).

    Скрипт, «отдающий» видео, работал долго (примерно столько же, сколько длился видео-ролик: мы установили контроль скорости скачивания согласно битрейту). Так вот, если в период просмотра видео вы открывали новый таб в браузере с другой страницей этого же сайта, возникала ошибка.

    Ларчик открывался довольно просто. На сайте использовалась авторизация, основанная на стандартных PHP-сессиях. Так вот, когда сессия стартуется, сессионный файл блокируется, и до тех пока сессия не закроется и файл не разблокируется, никто не может открыть файл сессии. По умолчанию сессия закрывается при окончании работы скрипта. Мы добавили непосредственно перед выдачей видео-контента строку session_write_close() — вуаля, все заработало.

    Поскольку совсем недавно товарищ пожаловался на точно такую же проблему и был рад полученной подсказке — я решил поделиться этим «хинтом» с хабралюдьми.
    Поделиться публикацией

    Похожие публикации

    Комментарии 14
      0
      Вообще-то сие поведение PHP описано в документации. Как говорится, RTFM.
        +1
        Описано-то оно описано… Вот только — где описано? На странице документации к session_write_close. Я вас уверяю, далеко не каждый (к сожалению) программист читает доку на каждую используемую функцию. В частности, человек, о котором я упомянул («товарищ пожаловался на точно такую же проблему») — довольно опытный PHP-программист, и его данная ситуация поставила в тупик, впрочем, как и меня поначалу. В мануале приведен пример с фреймсетами, у меня пример немного другой, но главное: я хотел описать симптомы неполадки и рецепт для их решения, чтобы некоторые люди подобные проблемы решили быстро — когда с ними столкнутся.
          0
          Да фиг с ним, с мануалом. Даже если данная фича не была бы описана в мане, имхо, несложно догадаться что происходит: сессия лежит в файле => если мы имеем 2+ конкурентных запроса от одного клиента, возникает вопрос: что что будет с данными сессии на момент завершения обоих запросов? Что происходит? Если файл данных сессии не лочится — есть риск возникновения конфликтов при сохранении данных в сессию. Следовательно файл сессии лочится на время работы скрипта. Делается тестовый стенд (два скрипта во фреймах со sleep(10000)), демонстрирующий наличие flock при работе с файлом сессии и ищется решение проблемы. Все же просто.
            0
            Что-то я не нахожу ни капли полезного смысла в ваших комментариях. Если вы все это знаете или можете логически/экспериментально вывести все, что нужно — этот топик просто не для вас. Он как раз для тех, кто, столкнувшись с подобной ситуацией, будет долго чесать репу и искать решение. И вообще, честно говоря, не понимаю, почему лично вы (если все, что здесь изложено, вам хорошо знакомо и, следовательно, неинтересно) — так оживленно комментируете :)
              0
              PS, так сказать: Топик-то в общем получил положительную оценку, так что, можно сказать, что я своей цели достиг ;)
          +1
          Мдя!!!
          ППЦ!!! Вот это архитектура! Я б Вас уволил за такое))
            0
            Это, простите, за какое такое? И где вы увидели хоть полслова об архитектуре?
              0
              Я не собираюсь вас обучать программированию и проектированию… как говорится, RTFM))) Это ж как надо извратиться, чтоб такую реализацию отдачи видео организовать) А про сессии Вы, наверное, вообще не вкурсе, для чего они используются и какие сэйв-хэндлеры существуют.
                0
                А я, заметьте, не просил обучать меня «программированию и проектированию». Тем более мне не нужно такое обучение от человека, который даже в элементарном вопросе не может сколько-нибудь осмысленно обосновать свою позицию. Я не вижу связи ваших комментариев с моим постом. Потрудитесь высказать свою точку зрения более подробно:

                1. Что вам не понравилось в реализации отдачи видео? (кстати, в посте ее, родимой, — реализации-то — нетути. Вы ктулху и сейчас едите мой мозг? )
                2. Из чего вы заключаете, что «про сессии Вы, наверное, вообще не вкурсе, для чего они используются»?
                3. Каким боком вы планируете увязать с моим постом фразу про сэйв-хэндлеры?
                  0
                  Отвечу просто… Ваша реализация отдачи видео НЕ должна быть завязана на сессии определенного клиента. Эта задача реализуется через отдельный независимый сервис.
                    0
                    Ого. Оказывается, вы знаете лучше меня и тех, кто ставит мне задачи, — что должна, а что не должна делать реализация отдачи видео?

                    Интересно, интересно… Я уже говорил, однако, что «на сайте использовалась авторизация»… Так вот, по условиям задачи, авторизованные пользователи могут смотреть видео, а неавторизованные — не могут (умолчим про то, что авторизованные, допустим, могут смотреть одно видео и не могут смотреть другое). Итак, берем слова про сессию назад?

                    И кстати, где ответы на 2-й и третий вопросы?
                      0
                      Помимо прочего, вы просто «не въехали» в тему. В данном топике конкретная задача, которую выполняет скрипт — вообще не должна интересовать читателя, я написал про выдачу видео — просто чтобы дать реальный пример (и, да, в моем конкретно случае мы дествительно работали с видео). С тем же успехом можно было бы отправлять какие-то SOAP-запросы по сети, в общем, подойдет любое действие, которое требует существенных временных затрат.
              0
              Ну раз уж хабр начал спамить мой почтовый ящик сообщениями о Ваших ответах в этой ветке, я продолжу) К Вашему сведению, есть более надежные, проверенные на высокой нагрузке способы отдачи видео как для авторизованых пользователей, так и не для авторизованых, включа уровни доступа к ОПРЕДЕЛЕННЫМ роликам (ну или допустим фотографиям). Они (способы) просто ОБЯЗАНЫ быть реализованными без PHP в связке с сессиями. Сессии тут абсолютно не причем.
              Назовите мне хоть один известный проект, в котором используется PHP(или любой другой интерпретируемый язык)+сессии для отдачи видео таким способом? Да Вы просто их не назовете)
                0
                О Великий! Вы снизошли до моего уровня и продолжили!

                К вашему сведению, на определенных уровнях нагрузки проекту абсолютно нет дела до того, кто там в нем отдает видео-контент :) В моем случае решение на PHP было очевидно самым простым.

                Если бы вы потрудились прочитать статью о видео, ссылку на которую я привел в этом посте, вы бы знали, что мне известно о других способах «отдачи» видео.

                Но вот вы говорите очевидную чушь: «Они (способы) просто ОБЯЗАНЫ быть реализованными без PHP в связке с сессиями». Это, скажите, перед кем обязаны? Чем вам PHP не угодил, если он прекрасно справляется со своей задачей? Чем вам сессии не нравятся? Если в проекте используются PHP-сессии — очевидно, что и для проверки прав доступа к видео-контенту удобнее всего использовать эти самые сессии.

                Никаких «известных проектов, в которых используется PHP для отдачи видео», само собой, нет и быть не может. Но не забывайте о других проектах, с посещаемостью не миллионы, скажем, а всего лишь пару-тройку сотен тысяч хитов и меньше: представьте себе, там тоже иногда нужно видео! И вот незадача — PHP здесь великолепно справится и усом не поведет!

                Вдобавок, вернусь к своему предыдущему комментарию и не поленюсь процитировать:

                «вы просто «не въехали» в тему. В данном топике конкретная задача, которую выполняет скрипт — вообще не должна интересовать читателя, я написал про выдачу видео — просто чтобы дать реальный пример (и, да, в моем конкретно случае мы дествительно работали с видео). С тем же успехом можно было бы отправлять какие-то SOAP-запросы по сети, в общем, подойдет любое действие, которое требует существенных временных затрат»

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

              Самое читаемое