Ahoj, spouštím pravidelně na serveru cronem php script, který updatuje status u položek v databázi. Informace o aktuálním statusu položek načítám z xml souboru, rozhodl jsem se použít funkci pcntl_fork(), protože většinu času script čekal na stažení xml souborů z webu. Takže se snažím načíst xml soubory vícevláknově. Jestli to chápu správně, tak při spuštění nemá vlákno přístup ke zdrojům rodiče, proto v každém vláknu musím otevírat nové připojení k DB. Na připojení a dotazy do databáze používám opravdu jednoduchou třídu.
class Mysql
{
private $mysql;
public static $server, $user, $pass, $db;
public function __construct() {
$this->mysql = mysql_connect(self::$server, self::$user, self::$pass, true) or die(mysql_error());
mysql_select_db(self::$db, $this->mysql);
}
function __destruct()
{
mysql_close($this->mysql);
}
public function querty($sql) {
$querty = mysql_query($sql, $this->mysql);
if(!$querty) { die('Invalid query: ' . mysql_error()."\n"); }
if(is_resource($querty) && mysql_num_rows($querty) > 0) {
while($result = mysql_fetch_array($querty)) {
$data[] = $result;
}
} else {
$data = array();
}
return $data;
}
}
include 'classes/Item.class.php';
error_reporting(E_ALL);
Mysql::$server = 'localhost';
Mysql::$user = 'mysql';
Mysql::$pass = 'mysqlpassword';
Mysql::$db = 'ireport';
foreach(Item::all(new Mysql()) as $item) {
$pid = pcntl_fork();
if(!$pid || $pid == -1) { // child
// zde nacitam xml a zjistim z nej novy status a nastavim ho treba do $xml['operation']
$db = new Mysql();
$db->querty('UPDATE items SET operation="'.$xml['operation'].'" WHERE id='.$item['id'].' LIMIT 1');
if(!$pid) { // child end
exit();
}
}
}
while(pcntl_wait($status) > 0) {
//wait for end of children
}
Item::all(new Mysql()) vrací pole řádků z databáze, procházím ho pomocí foreach a pro každé vlákno (1 položka = 1 vlákno) znovu vytvářím objekt Mysql() - připojuju se k DB. Momentálně cyklus foreach probíhá tak 130x. Problém je že
někdy dostanu tuhle chybu:
Invalid query: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (11)
nebo Lost connection to MySQL server at 'reading initial communication packet', system error: 110 a s tím spojené PHP Warning: mysql_close() expects parameter 1 to be resource, boolean given.Prostě se nepřipojím k DB. Čím je to způsobené? Je to max. počtem připojení v /etc/my.cnf? Je vůbec vhodné v každém vlákně otevírat připojení k DB? Jak jinak by to šlo řešit? (v PHP - a nechci slyšet že mám použít jiný vhodnější jazyk
Předem děkuji všem za reakce
