Önceki iki sorulardan yardımıyla, ben şimdi bir veritabanına ürün bilgileri besleyen bir çalışma HTML kazıyıcı var. Ne şimdi yapmaya çalışıyorum benim kazıyıcı pcntl_fork
a> ile çalışan alma ile beynimi etrafına sarılarak verimli geliştirmektir.
Ben, 10 ayrı parçalar halinde benim php5-cli komut bölerseniz, ben bu yüzden ben i / o veya cpu bağlı ama sadece benim kazıma fonksiyonlarının doğrusal doğası ile sınırlı değilim biliyorum büyük bir faktör ile toplam çalışma zamanını artırmak.
Birden kaynaklardan birlikte kaldırımlı ettik kodu kullanarak, ben bu çalışma test var:
<?php
libxml_use_internal_errors(true);
ini_set('max_execution_time', 0);
ini_set('max_input_time', 0);
set_time_limit(0);
$hrefArray = array("http://slashdot.org", "http://slashdot.org", "http://slashdot.org", "http://slashdot.org");
function doDomStuff($singleHref,$childPid) {
$html = new DOMDocument();
$html->loadHtmlFile($singleHref);
$xPath = new DOMXPath($html);
$domQuery = '//div[@id="slogan"]/h2';
$domReturn = $xPath->query($domQuery);
foreach($domReturn as $return) {
$slogan = $return->nodeValue;
echo "Child PID #" . $childPid . " says: " . $slogan . "\n";
}
}
$pids = array();
foreach ($hrefArray as $singleHref) {
$pid = pcntl_fork();
if ($pid == -1) {
die("Couldn't fork, error!");
} elseif ($pid > 0) {
// We are the parent
$pids[] = $pid;
} else {
// We are the child
$childPid = posix_getpid();
doDomStuff($singleHref,$childPid);
exit(0);
}
}
foreach ($pids as $pid) {
pcntl_waitpid($pid, $status);
}
// Clear the libxml buffer so it doesn't fill up
libxml_clear_errors();
Hangi aşağıdaki soruları gündeme getirmektedir:
1) Benim hrefArray Verilen 4 URL'ler içeren - dizi diyelim ki 1.000 ürün adresler içeren olsaydı bu kod 1000 çocuk süreçler doğuracağı? Eğer öyleyse, ne 10 söylemek süreçlerin miktarını sınırlamak için en iyi yoldur, ve bir örnek olarak yine 1.000 adresler, çocuk başına 100 ürün (10 x 100) çocuğun iş yükünü bölmek.
2) Ben bu pcntl_fork sürecin bir kopyasını oluşturur ve ben yapmak istiyorum ne gibi tüm değişkenler, sınıflar, kazımak için ürünlerin listesini oluşturur DOMDocument sorgu ile benim hrefArray değişkeni değiştirin, ve sonra onları besleyen öğrenmek ettik Çocuk süreçler kapalı işlem yapmak için - bu yüzden 10 çocuk işçilerin arasında yük yayılıyor.
Beynim ben (tabii ki bu işe yaramazsa, bu yüzden koşmak yok) aşağıdaki gibi bir şey yapmanız gerekir anlatıyor:
<?php
libxml_use_internal_errors(true);
ini_set('max_execution_time', 0);
ini_set('max_input_time', 0);
set_time_limit(0);
$maxChildWorkers = 10;
$html = new DOMDocument();
$html->loadHtmlFile('http://xxxx');
$xPath = new DOMXPath($html);
$domQuery = '//div[@id=productDetail]/a';
$domReturn = $xPath->query($domQuery);
$hrefsArray[] = $domReturn->getAttribute('href');
function doDomStuff($singleHref) {
// Do stuff here with each product
}
// To figure out: Split href array into $maxChilderWorks # of workArray1, workArray2 ... workArray10.
$pids = array();
foreach ($workArray(1,2,3 ... 10) as $singleHref) {
$pid = pcntl_fork();
if ($pid == -1) {
die("Couldn't fork, error!");
} elseif ($pid > 0) {
// We are the parent
$pids[] = $pid;
} else {
// We are the child
$childPid = posix_getpid();
doDomStuff($singleHref);
exit(0);
}
}
foreach ($pids as $pid) {
pcntl_waitpid($pid, $status);
}
// Clear the libxml buffer so it doesn't fill up
libxml_clear_errors();
Ama ne anlamaya olamaz, sadece ana / ana süreçte benim hrefsArray [] inşa etmek ve çocuk süreç için onu beslemek için nasıl. Şu anda ben denedim her şeyi alt süreçlerde döngüler neden olur. Yani benim hrefsArray master inşa ve sonraki her çocuk süreç içinde alır.
Ben tüm tamamen yanlış bu konuda gidiyorum eminim, bu yüzden büyük ölçüde doğru yönde sadece genel dürtmek seviniriz.