Komut satırı ve web sunucusu çağırmayı ayırt nasıl?

2 Cevap php

Bir betik komut satırından veya web sunucusu tarafından çağrılan eğer ayırt etmek için bir yolu var mı?

(See http://stackoverflow.com/questions/173851/what-is-the-canonical-way-to-determine-commandline-vs-http-execution-of-a-php-s iyi cevap ve daha ayrıntılı bir tartışma için - göndermeden önce bu bulamadım)


Apache 2.2.10 ve PHP 5.2.6 ile bir (üretim dışı) sunucusu var. Bunun üzerine, bir web erişilebilir dizininde benim PHP komut dosyası, maintenance_tasks.php. Ben komut satırından ya da (bir tarayıcıda açılması) bir HTTP isteği ile bu komut dosyasını çağırmak istiyorum. Bana güvenilir bir komut dosyası nasıl çağrılır belirlemek sağlayan bazı değişken var mı?

(Ben zaten sadece ayrı iki çağırma türlerini anlatan bir yol arıyorsanız, çağırma ve HTTP yanıt zaman aşımı her tür için farklı görüşlerin konuları ele)

Ben farklı şeyler çalışıyor ve aşağıda benim bulguları eklemek olacak.

Duplicate: http://stackoverflow.com/questions/173851/what-is-the-canonical-way-to-determine-commandline-vs-http-execution-of-a-php-s

2 Cevap

komut satırından çağrılırsa, sunucu değişkeni HTTP_USER_AGENT ayarlı değil. Ben komut dosyası komut satırından veya denir olmadığını tanımlamak için bu sabiti kullanabilirsiniz:

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

"User-Agent" başlığına dayanarak bir kullanıcı-tanımlı bir değer olduğundan, sorunlu olabilir - bu cevap yine 'doğru' olarak işaretlenmiş olduğundan UPDATE:, ifademi revize etmek istiyorum.

Açıklamalarda Eugene/cam8001 tarafından önerildiği gibi, php_sapi_name() == 'cli' veya PHP_SAPI == 'cli' kullanın.

Bu işaret için teşekkürler!

Ben $_SERVER superglobal hem çağırmaları mukayese ettik. Bu kabuk / komut satırından çalıştırırken $_SERVER['argc'] (Betiğe geçirilen yani sayısı) yalnızca ayarlanmış gibi görünüyor:

<?php
if (isset($_SERVER['argc'])) {
    define('CLI', true);
} else {
    define('CLI', false);
}

Linux ve Windows bilgisayarlar üzerinde hem iş gibi görünüyor. (Önce ortam değişkenleri bazı kontrol düşündüm, ama bu her işletim sistemi için farklıdır. Ayrıca, tüm $_SERVER['HTTP_*'] başlıkları CLI sürümünde eksik, ama bu güvenilir olmadığından emin değilim yeterli.)