Если Вы пишете свой уровень доступа к данным вручную, Вы по существу пишете Вашей собственной функции плохой ORM.
у Oren Eini есть хороший блог, который подводит итог того, в каких существенных особенностях Вы, возможно, нуждаетесь в своем DAL/ORM и почему это, пишущий Ваше собственное становится плохой идеей после времени: http://ayende.com/Blog/archive/2006/05/12/25ReasonsNotToWriteYourOwnObjectRelationalMapper.aspx
РЕДАКТИРОВАНИЕ: OP прокомментировал в других ответах, что его кодовая база не очень объектно-ориентирована. Контакт с объектным отображением является только одним фасетом ORMs. Активная Запись шаблон является хорошим примером того, как ORMs все еще полезны в сценариях где карта 1:1 объектов к таблицам.
Вот как это сделать. Вы указываете браузеру прочитать первые 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');
?>
Возможно, вам поможет этот конкретный комментарий на странице руководства php.net: http://www.php.net/manual/en/features.connection-handling.php#71172
Заголовки не будут работать (это заголовки, поэтому они идут первыми )
Я не знаю способа закрыть http-соединение без прерывания сценарий, хотя я полагаю, что есть какой-то неясный способ сделать это.
Если вы сообщите нам, что вы хотите сделать после того, как запрос будет выполнен, это поможет нам дать лучшие предложения.
Но в целом я бы подумал об одном из следующих:
1) Выполните простой сценарий командной строки (используя exec ()), который выглядит так:
#!/bin/sh
php myscript.php <arg1> <arg2> .. <argN> &
Затем начните это со своего http- связанный скрипт, например:
<?PHP
exec('/path/to/my/script.sh');
?>
Или:
2) Напишите другую программу (возможно, постоянно работающий демон или просто какой-нибудь скрипт, который так часто копируется) и выясните, как ваш код входящего запроса может передавать ему инструкции . У вас может быть таблица базы данных, в которой работают очереди, или попробуйте заставить его работать с каким-нибудь плоским файлом. Вы также можете сделать так, чтобы ваш веб-скрипт вызывал некоторую команду командной строки, которая заставляет ваш сценарий без запроса ставить в очередь некоторую работу.
В конце концов, вы не хотите ваш скрипт продолжит выполнение после HTTP-запроса. Предполагая, что вы используете mod_php, это означает, что вы будете связывать процесс apache до завершения работы скрипта.
Теоретически, если включено сохранение активности HTTP 1.1 и клиент получает ожидаемое количество символов от сервера, он должен рассматривать это как конец ответа и продолжать визуализацию страницу (при этом соединение остается открытым). Попробуйте отправить эти заголовки (если вы не можете включить их другим способом):
Connection: keep-alive Content-Length: n
Где n
- количество символов, которые вы отправили в ответе body (буферизация вывода может помочь вам посчитать это.) Мне жаль, что у меня нет времени проверить это сам. Я просто добавляю предложение на случай, если оно сработает.
Лучший способ добиться этого - использовать буферизацию вывода. PHP отправляет заголовки, когда они готовы и готовы, но если вы перенесете свой вывод в браузер с помощью ob_ *, вы можете контролировать заголовки на каждом этапе пути.
Вы можете сохранить отрисованную страницу в буфере, если хотите, и отправить заголовки до восхода солнца в Китае. Именно поэтому в настоящее время вы можете увидеть много открывающих тегов Php
, но не закрывающих тегов.