function ParseTasks() { $sql = "SELECT ID FROM deploy_tasks WHERE executed=0"; $q = new mysql(); $results = $q->QUERY_SQL($sql, "artica_backup"); while ($ligne = @mysql_fetch_array($results, MYSQL_ASSOC)) { events("Running task {$ligne["ID"]}"); $runed = runtask($ligne["ID"]); if (is_file($_GET["logcomputer"])) { $logcomputer = @file_get_contents($_GET["logcomputer"]); } @unlink($_GET["logcomputer"]); $logcomputer = addslashes(nl2br(htmlspecialchars($logcomputer))); if ($runed) { $sql = "UPDATE deploy_tasks SET executed=1, results='{$logcomputer}' WHERE ID={$ligne["ID"]}"; $q->QUERY_SQL($sql, "artica_backup"); } else { if (is_file($_GET["logcomputer"])) { $logcomputer = @file_get_contents($_GET["logcomputer"]); } $sql = "UPDATE deploy_tasks SET executed=2,results='{$logcomputer}' WHERE ID={$ligne["ID"]}"; $q->QUERY_SQL($sql, "artica_backup"); } events("Running task {$ligne["ID"]} finish"); } }
function ParseTasks() { $sql = "SELECT ID,computer_id FROM deploy_tasks WHERE executed=0 AND TASK_TYPE='OCS_AGENT'"; $q = new mysql(); $results = $q->QUERY_SQL($sql, "artica_backup"); while ($ligne = @mysql_fetch_array($results, MYSQL_ASSOC)) { $uid = $ligne["computer_id"]; writelogs("Running task {$ligne["ID"]}", __FUNCTION__, __FILE__, __LINE__); $sql = "UPDATE deploy_tasks SET executed=1 WHERE ID={$ligne["ID"]}"; $q->QUERY_SQL($sql, "artica_backup"); $runed = runtask($uid, $ligne["ID"]); } }
`rm -f {$dir}`; //如何实现异步多线程 foreach ($task as $job => $tasks) { foreach ($tasks as $url) { //进程上限锁 while (thread_count() > 10) { sleep(1); } $pid = pcntl_fork(); //父进程和子进程都会执行下面代码 if ($pid == -1) { //错误处理:创建子进程失败时返回-1. loger("Could not fork new thread !"); exit(1); } else { if ($pid) { //父进程会得到子进程号,所以这里是父进程执行的逻辑 pcntl_wait($status, WNOHANG); //等待子进程中断,防止子进程成为僵尸进程。 } else { //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。 $return = runtask($url, $proxy); loger($url . "->" . substr($return, 0, strpos($return, "\n"))); //子进程完成一定要结束掉进程,否则进程会越来越多 exit; } } } } } exit;