2014-07-13 3 views
-1

그래서 기본적으로 나는 cron.php 다른 톤을 설정하는 대신 부트 스트랩 파일로 사용하는 파일 Cron Jobs, 내 모든 별도의 Cron 파일에 포함 할 수 있기를 원합니다. 내가 할 수있는 방법 내가 file3.php을 가질 수PHP에서 병렬 함수를 포함합니까?

/* 
* run this file every minute to execute all crons 
*/ 

$included_cron = true; 

ini_set('max_execution_time', 0); 
require "files/core.php"; 

/*===== 1st Cron! =====*/ 

    include ROOT.'/files/crons/file1.php'; 

/*===== 2nd Cron! =====*/ 

    include ROOT.'/files/crons/file2.php'; 

/*===== 3rd Cron! =====*/ 

    include ROOT.'/files/crons/file3.php'; 

: 대신 1이 끝날 때까지 다음 등 두 번째를 기다리는 동시에 ...

여기에 내 현재 cron.php 파일입니다 file1.php와 같은 시간에 포함 된 PHP에서 가능합니까?

+1

는 멀티 스레딩은 기본적으로 PHP의 범위를 밖으로 가능성이 높습니다. –

답변

1

질문에 대한 답변은 다음과 같습니다

<?php 
class CronJob extends Threaded { 

    public function __construct($file) { 
     $this->file = $file; 
    } 

    public function run() { 
     require_once("files/cron/{$this->file}"); 
    } 

    protected $file; 
} 

$workers = 4; 

$pool = new Pool($workers); 

foreach (["file1.php", "file2.php", "file3.php"] as $file) { 
    $pool->submit(
     new CronJob($file)); 
} 

$pool->shutdown(); 
?> 

이것은 상당히 끔찍한 느낌이지만, 글을 쓰는 것이 더 나을 것 같습니다. 각 cron 작업은 스레드 된 객체로 수행됩니다. 여기에서 :: run에는 cron 작업 각각에 대한 비즈니스 로직이 포함됩니다. 그런

<?php 

class FirstJob extends Threaded { 
    public function __construct(Threaded $config) { 
     $this->config = $config; 
    } 

    public function run() { 
     /* do stuff for this cron job */ 
    } 

    protected $config; 
} 

class SecondJob extends Threaded { 
    public function __construct(Threaded $config) { 
     $this->config = $config; 
    } 

    public function run() { 
     /* do stuff for this cron job */ 
    } 

    protected $config; 
} 

class ThirdJob extends Threaded { 
    public function __construct(Threaded $config) { 
     $this->config = $config; 
    } 

    public function run() { 
     /* do stuff for this cron job */ 
    } 

    protected $config; 
} 

$workers = 4; 

$config = new Threaded(); 
$config["database"] = [ 
    "username" => "mine", 
    "password" => "secret", 
    "hostname" => "localhost", 
    "database" => "data"  
]; 


$pool = new Pool($workers); 
/* probably come up with something better, get classes from a database or configuration source or whatever */ 
$pool->submit(new FirstJob($config)); 
$pool->submit(new SecondJob($config)); 
$pool->submit(new ThirdJob($config)); 
$pool->shutdown(); 
?> 

뭔가 ...

0

원하는 것을 멀티 스레딩이라고합니다. php가 지원하는 것은 기본적으로 (확장자가없는) 것은 아닙니다. 대신 할 수있는 일은 다른 스크립트에 대한 HTTP 요청을 작성하는 것입니다.

cron.php

function http_head($url){ 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_exec($ch); 
curl_close($ch); 
} 
http_head("file1_url"); 
http_head("file2_url"); 

당신의 크론는 않는 경우 민감한 일 (당신의 크론을 실행하는 데 구글 크롤러, 또는 임의의 사용자가 원하지 않는) 당신이 당신의 호출 여부, 검사의 일종을 구현해야합니다 cron (예 : IP 주소).

파일 * .php에서 호출자가 연결을 종료 한 후 중단하지 않도록 php에 알려야합니다. ignore_user_abort (true);

+0

PHP는 멀티 쓰레딩을 지원하지 않지만'file_get_contents()'에 대한 병렬 호출을 제안합니다. 다른 스크립트를 중간에 닫고 백그라운드에서 작업하는 등 일부 세부 사항을 설명하는 것을 잊어 버린 것 같습니다. –

+0

감사합니다, 지금 당장 의미가 있어야합니다 –

0

모든 작업에 대해 단일 엔트리 포인트가 필요하지만 멀티 태스킹을 원한다면이를 지원하는 언어를 사용해야합니다. PHP는 그렇지 않습니다.

가장 확실한 선택은 bash는 다음과 같습니다

#!/bin/sh 
php /path/to/cron.php file1 & 
php /path/to/cron.php file2 & 
php /path/to/cron.php file3 & 
php /path/to/cron.php file4 & 

그리고 지금 당신은 단지 명령 행 인수 받아 cron.php을 조정할 필요

if (isset($argv[1])) { 
    $task = $argv[1]; 
}else{ 
    echo "Must specify task\n"; 
    exit(1); 
} 
switch($task){ 
    case 'file1': 
    case 'file2': 
    case 'file3': 
    case 'file4': 
     break; 
    default: 
     echo "Invalid task: $task\n"; 
     exit(2); 
} 

include ROOT . "/files/crons/$task.php"; 
+0

매우 흥미로운 선택입니다. –

관련 문제