Bir PHP betiğinin http ve komut satırı yürütme komutlarını belirlemenin standart yolu nedir?


156

Ben öncelikle çıktı biçimlendirme amacıyla, komut satırı veya HTTP üzerinden yürütülmüş olup olmadığını belirlemek için gereken bir PHP komut dosyası var. Bunu yapmanın kanonik yolu nedir? İncelemek olduğunu düşünmüştüm SERVER['argc'], ancak 'Apache 2.0 Handler' sunucu API'sini kullanırken bile bu nüfusun ortaya çıktığı ortaya çıktı.

Yanıtlar:


229

php_sapi_name()İşlevi kullanın .

if (php_sapi_name() == "cli") {
    // In cli-mode
} else {
    // Not in cli-mode
}

Dokümanlar ile ilgili bazı notlar:

php_sapi_name - Web sunucusu ile PHP arasındaki arabirim türünü döndürür

Kapsamlı olmasa da, olası dönüş değerleri aolserver, apache, apache2filter, apache2handler, caudium, cgi (PHP 5.3'e kadar), cgi-fcgi, cli, cli-server, süreklilik, gömme, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux ve web adları.

PHP> = 4.2.0'da, PHP_SAPIaynı değere sahip önceden tanımlanmış bir sabit de vardır php_sapi_name().


Teşekkürler. Neden doktor olduğuna meraklandım. örnek ilk 3 karakteri incelerken, açıklama dizenin tam olarak "cgi" olması gerektiğini belirtirken, bunun dışında bunun mükemmel olduğunu düşünüyorum.
Bobby Jack

Tabii ki, döndürülen dize 'cgi' değilse, bu da php'nin konsoldan yürütüldüğünü gösterir. Olduğu gibi, whaddayaknow, davam.
Adriano Varoli Piazza

@Adriano: belki de sizin durumunuzda php-cgi betiği çalıştırmak için kullanılır.

3
@Bobby, php.net belgelerindeki örnek, dizenin ilk üç karakterine bakarak hem "cgi" hem de "cgi-fcgi" ile eşleşir ... bu yüzden ve bu gerçekten mantıklı. Herhangi bir şey sadece php aramak için @hop geri almak için ciddi programcılar için dil yok: D
ChrisR

1
ilginç bir not: php.net/manual/tr/function.php-sapi-name.php denilen gerçek ikiliye bağlı olarak, komut satırından php çalıştırabilir ve yine de cgi-fgi alabilirsiniz
DAB

22

Bu her zaman işe yarayacaktır. (PHP sürümü 4.2.0 veya üstü ise)

define('CLI', PHP_SAPI === 'cli');

Bu, komut dosyalarınızın üst kısmında kullanımını kolaylaştırır:

<?php PHP_SAPI === 'cli' or die('not allowed');

8
İkinci pasajınız sıralı olmayan bir şey gibi görünüyor, beklerdimCLI or die('not allowed');
Madbreaks

1
@Madbreaks, iki ayrı kullanım söylüyordum. Ya birini ya da diğerini varsayıyordum - ama ikisini de kullanırsanız CLI or die('not allowed');mükemmel.
Xeoncross


7
Which makes it easy to use at the top of your scriptsiki ayrı kullanım gibi görünmüyor. Evet, ben büyücüyüm.
George Dimitriadis

9

İşte Drupal 7 uygulaması: drupal_is_cli () :

function drupal_is_cli() {
  return (!isset($_SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)));
}

Ancak Drupal 8 tavsiye kullanılarakPHP_SAPI === 'cli'


8

bence

$_SERVER['REMOTE_ADDR']

CLI'den doldurulmaz.

Ayrıca, $ _SERVER süper küresel içindeki tüm HTTP_ * anahtarları CLI'den doldurulmaz veya az önce bahsedilen doğru şekilde yapın :-)


4

php_sapi_Name dokümantasyon sayfasında bunun nasıl çalıştığı açıkça belirtilir:

PHP'nin kullandığı arabirim türünü (Server API, SAPI) açıklayan küçük harfli bir dize döndürür.

Kapsamlı olmasa da, olası dönüş değerleri aolserver, apache, apache2filter, apache2handler, caudium, cgi (PHP 5.3'e kadar), cgi-fcgi, cli, süreklilik, gömme, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux ve web adları.

Hop'un neden PHP'nin ciddi programcılar için olduğunu düşünmediğinden emin değilim (ciddi bir programcıyım ve günlük PHP kullanıyorum), ancak belgeleri açıklığa kavuşturmak istiyorsa belki de tüm olası web sunucularını denetleyebilir PHP'nin çalışabileceği ve her sunucu için olası tüm arabirim türlerinin adlarını belirleyebileceği. Yeni web sunucuları ve arayüzler eklendikçe bu listeyi güncel tuttuğunuzdan emin olun.

Ayrıca, Bobby şunları söyledi:

Neden doktor olduğuna meraklandım. örnek ilk 3 karakteri incelerken, açıklama dizenin tam olarak "CGI" olması gerektiğini belirtir

Örnek için açıklama:

Bu örnek, cgi-fcgi de olabileceğinden alt dize cgi'yi denetler.


Ah - ya o gün inanılmaz derecede dikkatsiz davranıyordum ya da bu yorumu yaptığımdan beri örnek güncellendi. Gerçi PHP hakkındaki düşüncelerinize yürekten katılıyorum; dayak çok yorucu olur.
Bobby Jack
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.