2008-12-05 25 views
60

Komut satırından veya web sunucusundan bir komut dosyasının çalıştırılmasının ayırt edilmesinin bir yolu var mı?Komut satırı ve web sunucusu çağırma nasıl ayırt edilir?

(en iyi yanıt ve daha ayrıntılı tartışma için What is the canonical way to determine commandline vs. http execution of a PHP script? bakın - göndermeden önce Şunu bulamadık) Ben (sigara üretimi) sahip


Apache 2.2.10 ve PHP 5.2 ile sunucu 0,6. Üzerinde, web erişilebilir bir dizinde benim PHP betiğim, maintenance_tasks.php. Bu betiği komut satırından veya bir HTTP isteğiyle (bir tarayıcıda açarak) çağırmak istiyorum. Komut dosyasının nasıl çalıştırıldığını güvenilir bir şekilde belirlememi sağlayan bir değişken var mı?

farklı şeyler denemeye ve gözlerimi eklemek olacağım (Ben zaten sadece ayrı iki çağırma türlerini anlatan bir yol arıyor, çağırma ve HTTP yanıt zaman aşımı her türü için farklı görüşlerin konular ele alındı) aşağıdaki bulgular.

Yinelenen: komut satırından denilen Eğer What is the canonical way to determine commandline vs. http execution of a PHP script?

+0

Hangi soru bu bir kopyası mı? Yinelenen soru bağlantılıysa yardımcı olacaktır. – starbeamrainbowlabs

+0

@starbeamrainbowlabs: "Duplicate: http://stackoverflow.com/questions/173851/what-is-the-canonical-way-to-determine-commandline-vs-http-execution-of-a-php-s" adresinden sorunun en sonu yeterince açık değil mi? – Piskvor

+0

Bu benim için herhangi bir nedenden dolayı görünmedi, cevabınız için teşekkürler :) – starbeamrainbowlabs

cevap

96

, sunucu değişken HTTP_USER_AGENT ayarlanmamış. Senaryonun komut satırından denir olup olmadığını tanımlamak için bu sabit kullanın:

define("CLI", !isset($_SERVER['HTTP_USER_AGENT'])); 

GÜNCELLEME: Bu cevap hala bir 'doğru' olarak işaretlenmiş yana, Bence ifademi revize etmek istiyorum - "User-Agent" başlığına güvenmek, kullanıcı tanımlı bir değer olduğu için sorunlu olabilir.

Lütfen yorumlarda Eugene/cam8001 tarafından önerilen şekilde php_sapi_name() == 'cli' veya PHP_SAPI == 'cli' kullanın.

Bunu işaretlediğiniz için teşekkürler!

+72

Kullanım 'php_sapi_name() == 'cli'' yerine –

+19

Ya da PHP_SAPI sabit kullanabilirsiniz http://uk3.php.net /manual/en/function.php-sapi-name.php#refsect1-function.php-sapi-name-notes – cam8001

+3

Bir CLI kullanıcısının normal olarak kısıtlanmış şeyler yapmasına izin veriyorsanız, sabit değeri kullanın. 'd yapmanız gereken bir yere "CLI" dizesiyle özel bir HTTP_USER_AGENT göndermektir. –

3

Her iki çağrıda da $_SERVER süper küresel ile karşılaştırdım. Kabuk/komut satırından çalıştırırken $_SERVER['argc'] (komut geçirilen ifade yani sayısı) sadece ayarlanmış olduğunu görünüyor:

Linux ve Windows bilgisayarlar üzerinde hem iş gibi görünüyor
<?php 
if (isset($_SERVER['argc'])) { 
    define('CLI', true); 
} else { 
    define('CLI', false); 
} 

. (Öncelikle bazı ortam değişkenlerini kontrol etmeyi düşündüm, ancak bunlar her işletim sistemi için farklıdır. Ayrıca, tüm $_SERVER['HTTP_*'] başlıkları CLI sürümünde eksiktir, ancak yeterince güvenilir olup olmadığından emin değilim.)

+10

Bu, bazı makinelerde çalışmaz, argc/argv get params ile doldurulur! –