Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Фоновая работа PHP, Работает через раз...
Winston  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме




******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 9509
Пользователь №: 18161
На форуме: 7 лет, 5 месяцев, 14 дней
Карма: 552




Всем привет! Есть функция для запуска скриптов на выполнение в фоновом режиме

Свернутый текст
function background_query($url)
{
$parts = parse_url($url);

$fp = fsockopen(
$parts['host'],
(
isset($parts['port']) ? $parts['port'] : 80),
$errno,
$errstr,
30
);

if(!$fp)
return false;
else
{
$out = "POST " . $parts['path'] . " HTTP/1.1\r\n";
$out .= "Host: " . $parts['host'] . "\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: " . strlen($parts['query']) . "\r\n";
$out .= "Connection: Close\r\n\r\n";

if(isset($parts['query']))
$out .= $parts['query'];

fwrite($fp, $out);
fclose($fp);
return true;
}
}


$param = array('i' => 'test', 'value' => 'some', 123, 'test1' => 'test2');
background_query('http://site.ru/test.php?text='.urlencode(json_encode($param)));

Смысл ее в том, чтобы открыть соединение, передать данные и закрыть соединение, не дожидаясь пока вызванный скрипт завершит работу.
Хочу заметить, что в ф-и постоянно выполняется блок else.
На локалке все работает как часы, все отлично, а вот после заливки на сервер скрипт работает через раз, то есть вызвал эту ф-ю, она вызвала файл и передала в него данные, я увидел результат, после этого опять перезагружаю страницу, но результата уже нету... С десяток раз страницу по-перезагружал результат появился... потом опять нету..., не понятно... :blink:

Решил сделать это с помощью curl, получился такой код
Свернутый текст
$ch = curl_init('http://site.ru/q/test.php');
$opts = array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => 'test=' . json_encode(array('i' => 'test', 'value' => 'some', 123, 'test1' => 'test2')),
CURLOPT_TIMEOUT_MS => 100
);
curl_setopt_array($ch, $opts);
curl_exec($ch);
curl_close($ch);

Работает безотказно (пока, надеюсь и дальше так же будет :))
Только вот какой вопрос меня волнует, дабы не дожидаться полного завершения работы вызываемого скрипта, я поставил таймаут 100мс. (CURLOPT_TIMEOUT_MS), а это как я понимаю не закрытие соединения, а его обрыв (или я ошибаюсь?). и если мы обрываем соединение то соответственно нету гарантии, что мы успеем вызвать нужный нам скрипт и передать ему все данные, верно? Как можно решить этот вопрос?
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Invis1ble  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме




******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 11787
Пользователь №: 23195
На форуме: 6 лет, 4 месяца, 14 дней
Карма: 429

Трезвый :
7 лет, 3 месяца, 14 дней


Winston
Цитата
после заливки на сервер скрипт работает через раз

http://php.net/manual/ru/function.fwrite.php - прочти первое примечание, я думаю это твой случай


--------------------
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Winston  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме




******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 9509
Пользователь №: 18161
На форуме: 7 лет, 5 месяцев, 14 дней
Карма: 552




Invis1ble
Спасибо за ссылку, почитал, но видимо у меня не этот случай, т.к. мне 0 не возвращается, а возвращается количество записанных байт...
Кстати проблема решилась после того как я добавил fread($fp, 1); после fwrite :blink: почему так... я объяснить не могу. Кстати проблема так же решается если добавить fpassthru($fp); скрипт тоже нормально отрабатывает, но на экран выводит заголовки
Свернутый текст
HTTP/1.1 200 OK Server: nginx Date: Fri, 01 Feb 2013 19:17:33 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: close X-Powered-By: PHP/5.2.17
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
T1grOK  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2703
Пользователь №: 24406
На форуме: 6 лет, 1 месяц, 21 день
Карма: 170




fpassthru - можно забуферизировать.


--------------------
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Invis1ble  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме




******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 11787
Пользователь №: 23195
На форуме: 6 лет, 4 месяца, 14 дней
Карма: 429

Трезвый :
7 лет, 3 месяца, 14 дней


У меня есть одна либа, я щас попробую поковырять и глянуть, как там реализовано. Правда там не http протокол.


--------------------
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Winston  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме




******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 9509
Пользователь №: 18161
На форуме: 7 лет, 5 месяцев, 14 дней
Карма: 552




Цитата (T1grOK @ 1.02.2013 - 21:22)
fpassthru - можно забуферизировать.

Я сначала так и сделал, до того как узнал, что fread тоже помогает.
Цитата (Invis1ble @ 1.02.2013 - 21:45)
У меня есть одна либа, я щас попробую поковырять и глянуть, как там реализовано

Глянь если не сложно smile.gif
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Invis1ble  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме




******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 11787
Пользователь №: 23195
На форуме: 6 лет, 4 месяца, 14 дней
Карма: 429

Трезвый :
7 лет, 3 месяца, 14 дней


Winston
biggrin.gif короче там долго ковырять, я засыпаю уже просто
вот исходники - https://github.com/reactphp/socket, там зависимости еще:
https://github.com/reactphp/socket/blob/master/composer.json - require


--------------------
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
vagrand  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2667
Пользователь №: 18145
На форуме: 7 лет, 5 месяцев, 16 дней
Карма: 84




Может не в тему, но почему бы не запускать скрипты в фоне через командную строку с параметром "&"?


--------------------
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Winston  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме




******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 9509
Пользователь №: 18161
На форуме: 7 лет, 5 месяцев, 14 дней
Карма: 552




vagrand
Хм.. тоже вариант что-то я его упустил из виду...

Кстати вот какая фигня получается, на сервере PHP 5.2.17 на локалке 5.4.6, после того как на сервере добавил fread($fp, 1); скрипт не дожидается завершения работы фонового скрипта, а на локалке после добавления начал дожидаться blink.gif
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8737
Пользователь №: 26630
На форуме: 5 лет, 9 месяцев, 6 дней
Карма: 591




Цитата (Winston @ 2.02.2013 - 11:38)
Кстати вот какая фигня получается, на сервере PHP 5.2.17 на локалке 5.4.6, после того как на сервере добавил fread($fp, 1); скрипт не дожидается завершения работы фонового скрипта, а на локалке после добавления начал дожидаться

отключи буферизацию, и вначале фонового скрипта добавь flush()
хотя лучше все же стартовать бэкграунд процесс в CLI, чтоб не занимать воркер апача.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Winston  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме




******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 9509
Пользователь №: 18161
На форуме: 7 лет, 5 месяцев, 14 дней
Карма: 552




killer8080
Спасибо за совет!
Но данная тема уже не актуальна год как.
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8737
Пользователь №: 26630
На форуме: 5 лет, 9 месяцев, 6 дней
Карма: 591




тю блин, на дату не посмотрел smile.gif
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса