Как закрыть php
Перейти к содержимому

Как закрыть php

  • автор:

Как закрыть соединение и продолжить выполнение скрипта

Порой перед разработчиком встает задача проделать действительно долгую операцию после отображения страницы, как например рассылка почтовых сообщений или обмен данными с удаленным сервером. Можно положить эту задачу на плечи крона, но если это не удобно/медленно/кошерно, приходится выкручиваться и изобретать странные решения. Одним из таких решений является выполнение долгой операции непосредственно после рендеринга страницы, что может подвесить соединение на пару (десятков, сотен) секунд, или, если поступить добросовестно и оборвать соединение, пройдет незаметно для пользователя. Об этом методе сегодня и поговорим.

Если обратится к спецификации HTTP, можно найти пару замечательных заголовков:

Connection: close - говорит браузеру оборвать соединение при достижении конца файла Content-Length: n - устанавливает длину документа

Посмотрим реализацию на PHP

set_time_limit(0); ignore_user_abort(true); ob_start(); // start buffer // out page content echo "This make take some time, please wait"; $length = ob_get_length(); // magic header('Connection: close'); header("Content-Length: " . $length); header("Content-Encoding: none"); header("Accept-Ranges: bytes"); ob_end_flush(); ob_flush(); flush(); // background echo "if you see this, i am not working =("; //long, long operation for ($i = 0; $i <= 100000; $i++)

Не забывайте про параметр max_execution_time в php.ini , которым ограничено время выполнения вашего скрипта. Content-Encoding установлен в none для того, что бы исключить изменения размера gzip модулями сервера, что приведет к неверной работе. Впрочем это не гарантирует 100% решение проблемы, так что используйте этот трюк с умом.

PHP5 Открыть, прочитать, закрыть файл

В этой главе Вы научитесь, как открыть, прочитать и закрыть файл на сервере.

PHP Открытый файл

Самый лучший метод для открытия файлов является функция fopen . Функция fopen , даст вам больше вариантов, чем функция readfile() .

Во время занятий, будем использовать текстовый файл, «webdictionary.txt»,:

AJAX = Асинхронный JavaScript и XML
CSS = Каскадные Таблицы Стилей
HTML = Язык Разметки Гипер Текста
PHP = PHP Гипертекстовый Препроцессор
SQL = Язык Структурированных Запросов
SVG = Масштабируемая Векторная Графика
XML = Расширенный Язык Разметки

Первый параметр fopen содержит, имя открываемого файла, а второй параметр указывает, в каком режиме должен быть открыт файл. Следующий пример также генерирует сообщение, если функции fopen не удается открыть указанный файл:

Пример

$myfile = fopen(«webdictionary.txt», «r») or die(«Не удается открыть файл!»);
echo fread($myfile,filesize(«webdictionary.txt»));
fclose($myfile);
?>

Совет: Функции fread() и fclose() будут объяснены позже.

Файл может быть открыт в одном из следующих режимов:

Режим Описание
r Открыть файл только для чтения. Указатель файла на начало файла
w Открыть файл только для записи. Удаляет содержимое файла или создает новый файл, если он не существует. Указатель файла на начало файла
a Открыть файл только для записи. Существующие данные в файле сохраняются. Указатель файла начинается в конце файла. Создает новый файл, если файл не существует
x Создает новый файл только для записи. Возвращает false и сообщение об ошибке, если файл уже существует
r+ Открытие файла для чтения и записи. Указатель файла на начало файла
w+ Открытие файла для чтения и записи. Удаляет содержимое файла или создает новый файл, если он не существует. Указатель файла на начало файла
a+ Открытие файла для чтения и записи. Существующие данные в файле сохраняются. Указатель файла начинается в конце файла. Создает новый файл, если файл не существует
x+ Создает новый файл для чтения и записи. Возвращает false и сообщение об ошибке, если файл уже существует

PHP Чтение файла

Функция fread() , чтение открытого файла.

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

Следующий PHP код считывает «webdictionary.txt» файл до конца:

fread($myfile,filesize(«webdictionary.txt»));

PHP Закрыть Файл

Функция fclose() используется для закрытия открытого файла.

Это хорошая практика программирования, чтобы закрыть все файлы, после того как закончили работу с ними. Вы не хотите открыть файл на ваш сервер принимает ресурсы!

Функция fclose() требует имя файла (или переменной, содержащей имя файла), который нужно закрыть:

$myfile = fopen(«webdictionary.txt», «r»);
// некоторый код для выполнения.
fclose($myfile);
?>

PHP Чтение одной строки

Функция fgets() используется для чтения одной строки из файла.

В примере ниже выводится первая строка файла «webdictionary.txt»:

Пример

$myfile = fopen(«webdictionary.txt», «r») or die(«Не удается открыть файл!»);
echo fgets($myfile);
fclose($myfile);
?>

Примечание: После вызова функции fgets() , указатель файла перемещается на следующую строку.

PHP Проверить отключение файла

Функция feof() проверяет, отключение файла «end-of-file» (EOF) было достигнуто.

Функция feof() полезен для цикла данных неизвестной длины.

В приведенном примере файл «webdictionary.txt» выводит строку, пока не будет достигнут конец файла:

Пример

$myfile = fopen(«webdictionary.txt», «r») or die(«Не удается открыть файл!»);
// Вывести все строки файла
while(!feof($myfile)) echo fgets($myfile) . «
«;
>
fclose($myfile);
?>

PHP Чтение одного символа

Функция fgetc() используется для чтения одного символа из файла.

В приведенном примере файл «webdictionary.txt» вводит символ, пока не будет достигнут конец файла:

Пример

$myfile = fopen(«webdictionary.txt», «r») or die(«Не удается открыть файл!»);
// Вывести все строки файла
while(!feof($myfile)) echo fgetc($myfile);
>
fclose($myfile);
?>

Примечание: После вызова функции fgetc() указатель файла перемещается на следующий символ.

РНР Полный справочник файловой системы

Для полной справки функций файловой системы, перейдите к нашему полному PHP Справочник файловой системы.

Как закрыть php

Покинул форум
Сообщений всего: 22
Дата рег-ции: Нояб. 2007

Помог: 0 раз(а)

Подскажите как закрыть окно браузера скриптом ява ? Или может ещё чем .
Только не пишите типа юзай виндов.клос. и т.п., напишите плиз полностью как должно быть.
Спасибо.

Отправлено: 20 Ноября, 2007 — 13:33:37

Здесь могла бы быть ваша реклама

Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel

Помог: 3 раз(а)

Отправлено: 20 Ноября, 2007 — 13:36:12

Покинул форум
Сообщений всего: 80
Дата рег-ции: Нояб. 2007
Откуда: Израиль, Ашкелон

Помог: 0 раз(а)

Отправлено: 20 Ноября, 2007 — 14:06:23

Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007
Откуда: Симферополь

Помог: 98 раз(а)

——
Список фильмов с описанием, блекджеком и. для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе

Отправлено: 20 Ноября, 2007 — 14:37:34

Покинул форум
Сообщений всего: 22
Дата рег-ции: Нояб. 2007

Помог: 0 раз(а)

Спасибо, это понятно, . но это по клику закроется, а как сделать чтобы скрипт отработал и окно само без клика закрылось ? Вы уж извините, я тупой очень . \n\n(Добавление)

valenok пишет:

О.то что надо, спасибо огромное .
Отправлено: 20 Ноября, 2007 — 19:53:43

Здесь могла бы быть ваша реклама

Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel

Помог: 3 раз(а)

Это вы счётчик пишите ?
Отправлено: 22 Ноября, 2007 — 07:59:49

Покинул форум
Сообщений всего: 22
Дата рег-ции: Нояб. 2007

Помог: 0 раз(а)

Нет не счётчик. Я в другом посте описал проблему.
Удалите этот или тот.
Повторю что там написал.
********
Я так и подумал, так всё же подскажете мне ответ на мой вопрос ?
Или без предупреждения системы нельза окошко закрыть ?
Давайте я изложу что мне требуется, может другое решение есть .
Вобщем закрытие окна мне нужно для того чтобы моя страница отображалась в браузере без адресной строки, кнопок, прокрутки . , первая страница открывает окно с такими параметрами (без кнопок и т.д.) грузит туда то что мне надо и сама закрывается. Может быть можно это как то иначе сделать ? Подскажите кто знает. =)

Отправлено: 22 Ноября, 2007 — 10:56:28

Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007
Откуда: Симферополь

Помог: 98 раз(а)

вобсчем я так понял что нужно закрыть окно без запроса.

Единственный вариант как это сделать:

1 файл который открывает окно.
2 файл содержит onload=»window.close();»

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

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

——
Список фильмов с описанием, блекджеком и. для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе

Отправлено: 22 Ноября, 2007 — 12:35:08

Покинул форум
Сообщений всего: 22
Дата рег-ции: Нояб. 2007

Помог: 0 раз(а)

Как закрыть php

Покинул форум
Сообщений всего: 224
Дата рег-ции: Окт. 2009

Помог: 0 раз(а)

Если мы начинаем любой php файл тегом

А стоит ли вообще закрывать. Я например уже как пол года не закрываю и ошибок не наблюдаю. закрываю если по необходимости использую html вставки, но это тоже крайне редко так как mvc решение таких проблем.

Отправлено: 27 Октября, 2011 — 11:15:02

Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011
Откуда: Днепропетровск

Помог: 28 раз(а)

koras можно и пробелы нигде не ставить, и вообще строки не переносить, а писать все в одну строку. компилятору все-равно.

Отправлено: 27 Октября, 2011 — 11:15:19

Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007
Откуда: Berlin

Помог: 707 раз(а)

koras пишет:
А стоит ли вообще закрывать.

Нет, не стоит. Более того, это даже пользу может принести — так как если закрыть и потом, например, сделать перенос строки/пробел и т.п. — это будет считаться выводом и может вызвать проблемы (например, include+отправка заголовков после этого)

Обратите внимание, в Zend к примеру, не закрывают

——
Есть в мире две бесконечные вещи — это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.

Отправлено: 27 Октября, 2011 — 11:34:41

Рекордсмен по количеству сообщений за 7 дней

Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008
Откуда: Москваль

Помог: 52 раз(а)

Наоборот, правильно, что не закрываете, Евген объяснил, почему
Отправлено: 27 Октября, 2011 — 12:18:48

Покинул форум
Сообщений всего: 26
Дата рег-ции: Окт. 2011

Помог: 0 раз(а)

А так же отключить вывод ошибок и перед каждым запросом поставить @, и затем будем полчаса гадать почему скрипт не работает.

Если уж пишите, пишите изначально правильно.

Отправлено: 27 Октября, 2011 — 12:40:10

Рекордсмен по количеству сообщений за 7 дней

Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008
Откуда: Москваль

Помог: 52 раз(а)

salim, вы это все к чему?
Отправлено: 27 Октября, 2011 — 14:09:54

Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011
Откуда: Днепропетровск

Помог: 28 раз(а)

кстати яркий пример того о чем говорит EuGen. Многие IDE считают своим долгом следить за тем, чтобы в конце файла была пустая строка, и если вы закроетесь тегом ?> после него появится еще одна строка в файле, которая попадет в буфер вывода.

Отправлено: 27 Октября, 2011 — 14:54:51

Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008
Откуда: из города

Помог: 90 раз(а)

White пишет:
Многие IDE считают своим долгом следить за тем, чтобы в конце файла была пустая строка

Ни разу не сталкивался с такими IDE. Можете объяснить, для чего нужна пустая строка в конце файла?

salim пишет:
Если уж пишите, пишите изначально правильно.

Если вы считаете что обязательно закрывать php тег правильно, то напишите почему.

Моё мнение, что закрывать или не закрывать php тег не имеет особого значение. В последнем случае меньше вероятность получить headers already sent из-за не аккуратности. Если вы работаете на каком нибудь фреймворке, то скорей всего в стандартах кодирования для него уже обозначен ответ на этот вопрос. Так что выбора как такового нету.

Отправлено: 27 Октября, 2011 — 16:23:45

Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011
Откуда: Днепропетровск

Помог: 28 раз(а)

Ch_chov пишет:
Можете объяснить, для чего нужна пустая строка в конце файла
сам не пойму зачем. но такая настройка есть по дефолту в geany.
если верить WIKI, то
Цитата:

отсутствие перевода строки в конце системных конфигурационных файлов приводит к тому, что последняя строка не учитывается

может по этой причине
Отправлено: 27 Октября, 2011 — 16:29:28

Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010

Помог: 69 раз(а)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *