Сценарий PHP может обмануть браузер в размышление, что Запрос HTTP закончен?

Если Вы пишете свой уровень доступа к данным вручную, Вы по существу пишете Вашей собственной функции плохой ORM.

у Oren Eini есть хороший блог, который подводит итог того, в каких существенных особенностях Вы, возможно, нуждаетесь в своем DAL/ORM и почему это, пишущий Ваше собственное становится плохой идеей после времени: http://ayende.com/Blog/archive/2006/05/12/25ReasonsNotToWriteYourOwnObjectRelationalMapper.aspx

РЕДАКТИРОВАНИЕ: OP прокомментировал в других ответах, что его кодовая база не очень объектно-ориентирована. Контакт с объектным отображением является только одним фасетом ORMs. Активная Запись шаблон является хорошим примером того, как ORMs все еще полезны в сценариях где карта 1:1 объектов к таблицам.

6
задан Robinicks 17 September 2009 в 03:25
поделиться

5 ответов

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

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Will not work
flush();            // Unless both are called !

// At this point, the browser has closed connection to the web server

// Do processing here
echo('Text user will never see');
?>
10
ответ дан 8 December 2019 в 05:56
поделиться

Возможно, вам поможет этот конкретный комментарий на странице руководства php.net: http://www.php.net/manual/en/features.connection-handling.php#71172

4
ответ дан 8 December 2019 в 05:56
поделиться

Заголовки не будут работать (это заголовки, поэтому они идут первыми )

Я не знаю способа закрыть http-соединение без прерывания сценарий, хотя я полагаю, что есть какой-то неясный способ сделать это.

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

Но в целом я бы подумал об одном из следующих:

1) Выполните простой сценарий командной строки (используя exec ()), который выглядит так:

#!/bin/sh
php myscript.php <arg1> <arg2> .. <argN> &

Затем начните это со своего http- связанный скрипт, например:

<?PHP
exec('/path/to/my/script.sh');
?>

Или:

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

В конце концов, вы не хотите ваш скрипт продолжит выполнение после HTTP-запроса. Предполагая, что вы используете mod_php, это означает, что вы будете связывать процесс apache до завершения работы скрипта.

4
ответ дан 8 December 2019 в 05:56
поделиться

Теоретически, если включено сохранение активности HTTP 1.1 и клиент получает ожидаемое количество символов от сервера, он должен рассматривать это как конец ответа и продолжать визуализацию страницу (при этом соединение остается открытым). Попробуйте отправить эти заголовки (если вы не можете включить их другим способом):

Connection: keep-alive
Content-Length: n

Где n - количество символов, которые вы отправили в ответе body (буферизация вывода может помочь вам посчитать это.) Мне жаль, что у меня нет времени проверить это сам. Я просто добавляю предложение на случай, если оно сработает.

2
ответ дан 8 December 2019 в 05:56
поделиться

Лучший способ добиться этого - использовать буферизацию вывода. PHP отправляет заголовки, когда они готовы и готовы, но если вы перенесете свой вывод в браузер с помощью ob_ *, вы можете контролировать заголовки на каждом этапе пути.

Вы можете сохранить отрисованную страницу в буфере, если хотите, и отправить заголовки до восхода солнца в Китае. Именно поэтому в настоящее время вы можете увидеть много открывающих тегов , но не закрывающих тегов.

2
ответ дан 8 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: