sistemi ('php file.php');

12 Cevap php

hiçbiri

<?php system('php file.php'); ?>

ne

<?php system('/usr/bin/php file.php'); ?>

çalıştı. Neden?

I-!#/usr/bin/php, vs ile, -q denenmiş

12 Cevap

Sen-f ile aramak gerekiyordu, ama o kadar iyi çalışması gerekir:

<?php system('/usr/bin/php -f file.php'); ?>

Eğer "çalışmıyor" ile ne demek istiyorsunuz?

Eğer onlar komut sanki içeriği outputted olmak istediniz mi? include veya require kullanın.

Eğer bir değişken içeriğini istiyor muydu? backtick operator kullanın.

Eğer ters tırnak operatörü yerine sistemini kullanarak geri komutundan ne olsun görebilirsiniz.

Güvenli modda nedeniyle olabilir.

Note: When safe mode is enabled, you can only execute files within the safe_mode_exec_dir. For practical reasons, it is currently not allowed to have .. components in the path to the executable.

http://www.php.net/system.

Daha fazla bilgi olmadan ... muhtemelen PHP yürütülebilir, dosya.php için yolu veya dosya izinleri soruna yol.

Eğer 'file.php' tam bir yolda geçecek ne olur?

Ayrıca, üretilen hata mesajlarını görebilirsiniz böylece bir dosyaya çıktı (ama stdout ve stderr) yönlendirmek için çalışın.

Tüm cevap için teşekkürler!

Geri dönmek ya da bir şey yazmıyor: Kastettiğim 'çalışmıyor' için.

Ben iki dosya A.php var && (tüm izinler ile) b.php ve safe_mode kapalı

b.php

<?php
$a = system('/usr/bin/php -f /Applications/MAMP/htdocs/a.php',$b);
print_r($a);
echo '-'; # for separation
print_r($b); ?>

ve a.php

<?php echo 'hello world'; ?>

Ben tarayıcı (localhost / b.php) den b.php çalıştırdığınızda ve yazdırır:

string(0) "" -int(5)

O $ b değişkeni 5 olduğu anlamına gelir ancak ... 5 ne?

Hata raporlama açtığınızda ne diyor?

<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
$a = system('/usr/bin/php -f /Applications/MAMP/htdocs/a.php',$b);
print_r($a);
echo '-'; # for separation
print_r($b);

Ben değiştirdiğinizde

system('/usr/bin/php -f /Applications/MAMP/htdocs/a.php',$b);

için

('/bin/php -f /Applications/MAMP/htdocs/a.php',$b);

o diyor ki 127 5 yerine, ben bu hata kodları vardır sanırım

Açıktır ki system function nasıl çalıştığını anlamıyorum. Ne gerçekten ihtiyacınız muhtemelen popen. popen ile işlemini başlatın ve daha sonra örneğin fgets ile çıkış okumak.

Alternatif olarak siz zaten başkaları tarafından önerilen ters tırnak operatörünü kullanabilirsiniz.

Deneyin:

$output = array();
$returnCode = 0;
exec('/usr/bin/php -f /Applications/MAMP/htdocs/a.php 2>&1', $output, $returnCode);
print_r($output);

2>&1 Stdout'a stderr'yi yönlendirir, böylece herhangi bir hata iletileri yakalanır $output

Deneyin:

$fp = popen('/usr/bin/php -f file.php', 'r');

if(false === $fp)
{
   // something bad happened: error handle
}

$contents = '';

while(false === feof($fp))
{
  $contents .= fgets($fp);
}

fclose($fp);    
echo $contents;

Bu hatalar için altkabuk çıkışını ve tuzak yakalamak için izin verir.

Bekle ... Ne aslında burada ulaşmak için çalışıyoruz? Sadece a.php çalıştırın ve tarayıcıya çıktı dönmek? Bu durumda, include o. Ne istediğiniz gibi görünüyor; A.php sizin yayınlanmıştır içeriği () görünüyor itibaren.

A.php içeriği daha varsa, o zaman geri gönderebilir ve gerçekten ne yapmak istediğinizi açıklayınız.

}} Demek 'çalışmıyor' İçin: geri dönmek ya da bir şey yazmıyor.

Sunucu üzerinde bir terminal / kabuk almak denemek ve sistem komutu deneyin. Eğer which php php cli doğru yolu bulmak için gibi bir şey kullanabilirsiniz unixy OS ise.

Haklısınız php cli yüklemek mi? Genellikle varsayılan olarak yüklü değildir.

Web sunucusu, bir chroot'u falan yapıyor mu? Belki php cli size sistemi () kullanmaya çalıştığınız ortamda yok.

Bunun yerine bir script aramaya çalıştığınız basit bir system('php -v') yapmaya çalışın. Bunu php sürüm numarası ardından komut dosyası çağrısı doğru çıktı eklemek için olsun.