У меня есть скрипт download.php, который обнаруживает, что пользователь вошел в систему с переменной $ _SESSION и считывает видеофайл пользователю. Если я вызываю это из элемента в Safari 5.0.5, скрипт обнаруживает переменную сеанса и работает как ожидалось. В 5.1 переменные сеанса НЕ читаются программой download.php и действуют так, как будто пользователь не вошел в систему. Если я вызываю скрипт непосредственно из адресной строки, он отлично работает. Если я позвоню из своего iPhone, он также будет обнаружен. Кто-нибудь знает, если это ошибка или если есть обход? Мне пришлось бы переписать много, чтобы не использовать сеансы. Благодарю.
Вот сценарий устранения неполадок. Это показывает правильные данные сеанса:
<?php session_start(); ?> <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Test</title> </head> <body> <video width="640" height="480" controls="true" autoplay="false" id="v"> <source src="video.php" type="video/mp4" /> </video> <?php echo "<pre>"; var_dump($_SESSION); echo "</pre>"; ?> </body> </html>
Это записывает «Session Not Detected» каждый раз, когда я загружаю указанную выше страницу, но сеанс обнаружен с помощью Safari 5.0.5 и iOS:
<?php session_start(); // write local error log function write_log($txt) { $myFile = 'error.log'; $fh = fopen($myFile, 'a') or die("can't open file"); fwrite($fh, "$txt\n"); fclose($fh); } if ($_SESSION) { write_log(date('Ymd H:i:s'). ' Session Detected'); } else { write_log(date('Ymd H:i:s'). ' Session Not Detected'); } ?>
EDIT: Safari Inspector показывает статус вызова video.php как «ожидающий» и не имеет заголовков, кроме URL-адреса запроса. Исправлено session_start, но все равно работает одинаково.
EDIT: Хорошо, если я прочитаю переменные SERVER, разница между 5.1 и 5.0.5 заключается в том, что 5.0.5 имеет: HTTP_CONNECTION => close, а HTTP_COOKIE содержит PHPSESSID
EDIT: Я запускал Safari в 32-битном режиме, и он работал снова …
Если файлы cookie автоматически не передаются скрипту, вызываемому элементом <video>, вы можете просто передать PHPSESSID в качестве параметра GET, поэтому на странице, где встроено видео, вы помещаете что-то вроде:
<video ...> <source src="video.php?PHPSESSID=<?php echo session_id(); ?>" type="video/mp4" /> </video>