CRON kullanmadan Programı komut

6 Cevap php

Ben bir php dosyasını çalıştırmak için CRON kullanma hakkında birçok mesaj var biliyorum. Ancak, hosting, ve bir kullanıcı için kurulum kolaylığı dünyasında, o karmaşa var istemiyorum.

Ben yuva ile ilgisi var çevrimiçi başka bir çözüm bulundu. Sadece herkesin bu almak olsun, ve bu iyi ya da kötü bir fikir olup olmadığını bana söylemek istedim. Iyi çalışıyor gibi görünüyor.

Düşünceler?

//Open socket connection to cron.php
$socketcon = fsockopen($_SERVER['HTTP_HOST'],80,$errorno,$errorstr,10);
if($socketcon) {
$socketdata = "GET /cron.php HTTP 1.1\r\nHost: ".$_SERVER['HTTP_HOST']."\r\nConnection: Close\r\n\r\n";
fwrite($socketcon,$socketdata);
//Normally you would get all the data back with fgets and wait until $socketcon reaches feof.
//In this case, we just do this:
fclose($socketcon);
} else {
//something went wrong. Put your error handler here.
}

cron.php:

//This script does all the work.
sleep(200);
//To prove that this works we will create an empty file here, after the sleep is done.
//Make sure that the webserver can write in the directory you're testing this file in.
$handle = fopen('test.txt','w');
fclose($handle);

Bir blog yazısından komut dosyası bulundu: http://syn.ac/tech/13/creating-php-cronjobs-without-cron-and-php-cli/

6 Cevap

Bu kötü bir yöntem değil, ama bunu tamamlanmadan önce sadece komut sonlandırma değil yuva kapatarak emin olmanız gerekir. Sen engellenmeyen için yuva ayarlayabilirsiniz.

Ben hala bir ağrı biraz olsa bile, bir cron işi kullanabilirsiniz.

Bu cron daha farklı bir etki oluşturur.

Bir cron işi vaktinden ayarladığınız belirli zamanlarda çalışır.

Sizin yöntem temelde "çatal" veya PHP komut dosyası "zaman uyumsuz çağrı" bir türüdür. Burada ne yapıyorsun gibi HTTP üzerinden yapıyor kolay ve ucuz bir tekniktir. Ben bunu kendim de kullanıyorum. Hemen "arka plan" işlemini başlattı ki o cron'nun farklıdır.

Bir kaç yorum olsa:

  1. Her şeyden önce, size "arka plan" script ignore_user_abort() çağrı olmalıdır. Aksi takdirde, birçok ortamlarda script "arama" komut yuva kapattığında iptal edilecektir.

  2. İkincisi, aslında "arka plan" script $_SERVER['HOST'] değişkeni kontrol edebilir ve bu şekilde internete maruz olmayan komut olabilir (temelde localhost istekleri sorunu ve ) arka betik içinde kontrol edin. Daha sonra muhtemelen kendi makinesinden gelen istekleri güven, ve benzeri tüm güvenlik kontrolleri, oturumları ve atlayabilirsiniz.

  3. Üçüncüsü, kim "arka plan" komut dosyası PHP ile çalıştırmak gerektiğini söylüyor? Eğer bir "arka plan" süreci olarak kullanmak için gidiyoruz eğer PHP zayıf bir yeri vardır. Ana zayıflık olduğunu I / O üzerinde o blok Her zaman, e-posta gönderme veritabanı satırları güncelleme, veya ne olursa olsun, temelde komut duraklatma vardır olacak Yani eğer bir istek gönderebilir. Node.js ile ise, örneğin, I / O uyumsuz komutları kapalı yangın ve devam edebilirsiniz. PHP kullanmak için gidiyoruz eğer, en azından bir anda 10 e-postalar göndermek için emin olun, veya 10 bir seferde satırları, ya da bir şey güncelleyin.

  4. Son olarak, bir plan komut dosyası bir şey yapıyor ise tarayıcı üzerinde bir ilerleme çubuğu görüntülemek isteyebilirsiniz. Yani görev için ilerleme kaydetmek için (sizin veritabanı gibi) ortak bir veri deposu kullanmanız gerekir gidiyoruz.

Bir cron işi temelde bir cron iştir. bunu kurmak, ve işletim sistemi sizin için işi çalıştırır. Ben siteden aldım PHP komut dosyası nasıl çalıştığını emin değilim, ama insan müdahalesi gerekiyorsa, o zaman onun gerçekten bir cron işi olarak değil. Eğer cron kullanmak istemiyorsanız, bir tarih ve saati kurmak için PHP tarih fonksiyonları kullanın, sonra bir döngü kullanabilirsiniz. Pseudocode

while (1) {
    $d=date("d");
    if ( $d == "01" ){
        //run every 1st of month
        //code to run here
    }
}

Eğer makine ilk komut dosyası çalıştıran tüm gün bağlı olması gerekir garanti fonksiyonel ama garip bir çözüm bu. Bunu isterseniz, ben bu amaçla wget ya da curl kullanarak bir kabuk komut dosyası kullanmak için tavsiye ederim.

Örneğin:

#!/bin/sh

curl -O http://www.myserver.com/cron.php 2>&1 > /var/log/remote.cron.log

Ama sen çok syncronizedly çalıştırmak zorunda dont uygulamak isterim çözelti daha sonra, o daha iki saat önce olsaydı, komut dosyası son kez koştu zaman görmek için index.php sonunda bir onay olduğunu düşünüyorum include('cron.php'). Ayrıca performans ceza önlemek için, bir çevre değişkeni içinde komut koştu ne zaman damgası saklayabilirsiniz.

Ben iyi anlamak, cron-özürlü ana barındırılan olurdu ikinci senaryo üzerinde bir hit yapma, uzak bir makineden ilk komut dosyasını çalıştırmak? Sonra, bir böcek ya da hemen bağlantısını kapatın php / webserver etkileşim garip özelliği sayesinde, komut dosyası zaman aşımı olmaz?

İlk bölüm bu çok hizmeti (http://www.webcron.org/index.php?lang=english örneğin otomatik olarak bunu sormak hakkında herhangi bir zamanda istediğiniz herhangi bir komut poke veren şirketler bile var, oldukça yaygın bir uygulamadır ) bir ücret için, için.

İkinci bölüm benim için bilinmemektedir. Bu benim için php / webserver etkileşim içinde bir böcek gibi görünüyor, ama yanlış olabilir. Her neyse, ben bir hata ya da değil (bekle, sizin şu anda doğru ne yapıyor?) Ve o okunaklı davranış olmaktadır eğer, bunun için gitmek olmadığını kontrol katına çıkacak. Bu bir hata gibi görünüyor Eğer fixed her zaman olabilir, daha sonra bu güvenmeyin.

Bildiğim kadarıyla bu blog yazısı okuma ve kod bakarak anlamak gibi, bu gerçekten etrafında cron erişimine sahip olmayan bir yol değildir, bu uzun bir sorguya yanıt sunucu için bekleyen birisi önlemek için bir yoldur. Kesinlikle idam belli bir betik her 10 dakika kadar söylemek gerekiyorsa, o zaman cron kullanmanız gerekir. Sadece Kullanıcıların bitirmek için uzun bir sorgu için beklemek zorunda kalmamak istiyorsanız, o zaman bu hack işe yarayabilir. Hatta bu yöntemle, ben hala sizin komut PHP bitirmek için sağlar ne daha uzun sürerse zaman sınırları vurmak için gidiyoruz düşünüyorum.

Bu işlerin bir timestamped dizi karşı kontrolleri tetiklemek için siteyi ziyaret eden kullanıcılardan tamamen güvenmek sanki wp-cron.php (blog linkte belirtilen) gözden görünüyor.

Bu teknikler başka bir sunucu belirli aralıklarla ping yoksa çok güvenilir olacak değildir. Tekniğinin temel amacı, bir kullanıcı bekleme yerine cron'nun tüm kullanımlar için gerçek bir yedek daha, her bir süre çalıştırmak için temizlik veya bakım komut için 15 saniye gibi söylemek kaçınmaktır.