Jump to content
  • 0

Запуск скрипта в "фоновом режиме"


CoDy
 Share

Question

Всем привет!!!

Делаю на сайте точку входа для загрузки данных от других хостов. Причем объем данных может быть оч. большой и соответственно на их обработку может уйти много времени(5-10 сек и более).

Хочу сделать, чтобы отправитель данных не дожидался их полной обработки, а отпадал сразу после того, как я сохраню переданные им данные в временном файле. А перед выходом из скрипта запустить обработку сохраненных данных.

Погуглил на тему многопоточность в php, получилось запустить скрипт через сокет, а через курл не катит.

Мож кто подскажет, можно ли асинхронно запустить скрипт через курл??

Набросок класа: BackThread.php

<?php  


  
/**
*/
class BackThread
{
/**
*/
protected $_adapter = '';

/**
*/
protected $_host = '';

/**
*/
protected $_script = '';

/**
*/
protected $_obj = array();

/**
*/
public function __construct(
$adapter = 'socket',
$host = '',
$script = ''
)
{
$this->_adapter = strtolower($adapter);
$this->_host = $host;
$this->_script = $script;
}

/**
*/
public function __destruct()
{
foreach ( $this->_obj as $obj ) {
unset($obj);
}
}

/**
*/
public function startThread()
{
$adapterMethod = $this->_adapter .'Thread';

return $this->$adapterMethod();
}

/**
* Фоновый запуск скрипта через неблокируемый сокет.
*/
protected function socketThread()
{
$fp = fsockopen($this->_host, 80, $errno, $errstr, 30);
stream_set_blocking($fp, 0);

$out = "GET {$this->_script} HTTP/1.1\r\n";
$out .= "Host: {$this->_host} \r\n";
$out .= "Connection: Close\r\n\r\n";

fwrite($fp, $out);

fclose($fp);

$this->_obj['socket'] = $fp;

return $this;
}

/**
* Фоновый запуск скрипта через мульти курл.(не работает)
*/
protected function curlThread()
{
$mch = curl_multi_init();
$ch = curl_init($this->_host . $this->_script);

curl_multi_add_handle($mch ,$ch);
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false
));

$active = null;
curl_multi_exec($mch, $active);

$this->_obj['ch'] = $ch;
$this->_obj['mch'] = $mch;

return $this;
}
}

 

Точка входа

data_in.php

<?php  

error_reporting(-1);
ini_set('display_errors', true);

// Путь к скриптам на сайте.
$host = $_SERVER['HTTP_HOST'];
$script = '/test/data_processing.php';

// Получаем данные и кидаем их в временное хранилище.
// .....

include_once dirname(__FILE__) .'/BackThread.php';
$thread = new BackThread('socket', $host, $script);

// Замер времени работы.
$socketDelay = microtime(true);

// Запуск скрипта в фоновом режиме.
$thread->startThread();

// Замер времени работы.
echo 'time delay: ', microtime(true) - $socketDelay;

// Закрываем текущий скрипт, а фоновый всеравно отработает.
exit();

 

Скрипт для тестирования

data_processing.php

<?php  

error_reporting(-1);
ini_set('display_errors', true);

$fp = fopen('test.txt', 'a');
fwrite($fp, "——————--\r\n");
fwrite($fp, time() .": file open;\r\n");

sleep(5);
fwrite($fp, time() .": file write;\r\n");

fwrite($fp, time() .": file close;\r\n");
fclose($fp);

exit();

?>

 

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0
Никогда не работал с функцией exec().

Да и я думал что такие вещи на хостеры не разрешают делать.

Попробую, спасибо.

Думаю хостеры помимо этого не будут рады что скрипт будет гоняться по 5-10 секунд/за раз, чай не выделенный сервер поди ...

Link to comment
Share on other sites

  • 0
Никогда не работал с функцией exec().

Да и я думал что такие вещи на хостеры не разрешают делать.

Попробую, спасибо.

Да помнять хостера и всего делов. Ну или тариф поменять. Например, там где я хостюсь самый дешевый VDS стоит 350 рублей в месяц — там хоть по стопицот часов скрипты будут работать и разрешено всё, что угодно.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy