PHP exec PHP kullanarak komut dosyası çalıştırmak edemez

7 Cevap php

Ben PHP exec çağrısı kullanarak (3 parti ile web hizmetleri) birkaç saniye sürer, bir komut dosyası çağırmak çalışıyorum. Çok mücadele sonra, ben klasik merhaba dünya örneği için bu azalır. : Çağrı komut gibi görünüyor

exec('/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &');

Ben bu çalıştırdığınızda beklendiği gibi, çıkış execoutput.txt değil hello world çağıran komut sayfasının bir kopyasını içerir.

Neden bu PHP komut dosyası exec kullanarak çalıştırmak için alamıyorum? I ls -l gibi bir şey komutunu değiştirmek beklendiği gibi çıktı bir dizin listesi olduğunu unutmayın. btw, durumda ben 755 denilen komut chmod yoktu, önemli ...

Update - Ben çağıran betiğin sonuna exec çağrısı taşınmış ve en azından şimdi ben çağıran komut çıktı idam görmüyorum. Posterler thx ve ben bu fikirlerin bazıları çalışacağız.

Yardım!

Thanks Steve

7 Cevap

Ben de bu sorunu vardı ve bu php bir hata (# 11430) çıkıyor. Düzeltme bir php komut dosyası içinde başka bir php komut dosyası çağırırken php-cli kullanmaktır. Demek hala exec ama yerine kullanımı php kullanımı php-cli tarayıcıda ararken yapabilirsiniz:

exec("php-cli  somescript.php");

Bu benim için çalıştı.

Ne exec sağdaki komutunu alarak ve hedefe ekleme edilir yapıyor. Eğer php komut shebang hattı varsa, php yorumlayıcısı ikili direktifi eklemek gerekmez.

sadece betiğin çıktısını istiyorsanız, deneyin:

exec('/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &')

Eğer hataları dosyasında olmak istemiyorsanız, ancak önceden dosyaya çıktısı için STDERR yönlendirmelidir. Şöyle:

exec('/home/quote2bi/tmp/helloworld.php 2> /dev/null > /tmp/execoutput.txt')

Yukarıdaki execoutput sadece çıkış "Merhaba Dünya" olmalıdır.

Edit:

İlginç Bu davranış alıyorsanız. Siz komutu "ls" çalıştı belirtti. Bunun için bir takma ad yapmayı deneyin ve böylece gibi bir dosyaya yönlendirebilirsiniz:

alias pexec='php /home/quote2bi/tmp/helloworld.php'

o zaman

exec('pexec > /tmp/execoutput.txt 2>&1 &')

Bu kabuğun kendisi yerine exec girişini işleyen yolu ile bir sorun gibi görünüyor.

-John

Sorun PHP kendisi ile birlikte, bu komut argv $ gibi her şeyi davranır olduğunu. / Dev / null bir dosya ou çıktısını yönlendirmek değil.

Ben bir süre önce aynı sorunla karşı karşıya. Ne yaptım oluşturmak için bir runscript.php / opt / php-bin ve daha sonra bu komut içine Bu, çalışan ne olması gerektiğini çalıştırın. Böyle bir şey:

$script = $argv[1]
$params = implode(' ', array_slice($argv, 2));
$cmd    = "{$script} {$params} > /dev/null &";

$output = array();
$return = 0;
exec("php {$cmd}", $output, $return);

exit((int)$return);

Ve sonra kullanarak çağırır:

exec('/opt/php-bin/runscript.php /path/to/your/script.php arg1 arg2')

Ben bu çalışma almak için yönetilen tek yolu bu.

Eğer sadece basit bir php komut dosyası çalıştırmak için olası bir yol çalıştırıyorsanız tüm kod bu php dosyası ve çıkış herhangi bir sonuç çalışacak () dahil kullanmaktır. Sen bir metin dosyasına doğrudan çıkış olamaz ama Merhaba Dünya php script gibi görünüyor eğer bu tarayıcı penceresinde görünmelidir

<?php echo "Hello World!"; ?>

o tarayıcıda o tükürmek olacaktır. Yani ikinci bir kod gibi görünür

<?php include("helloWorld.php");  echo " PHP ROCKS";?>

, gibi görünecektir bir sayfa elde

Merhaba dünya! PHP KAYALAR

Bu dosyayı çalıştırmak için nasıl bilir böylece yerine sadece "... / Dosya.php" çağırmak, "php ... / dosya.php" deneyin.

exec('php /usr/bin/php /home/quote2bi/tmp/helloworld.php');

Bu alanda PHP belirtilen sorunları önlemek için, neden bir kabuk içinde bu koymak değil? PHP daha sonra içsel olarak ele alınan tüm yönlendirmeleri sahip kabuk çalıştırabiliriz.

Dinamik şeyleri değiştirmek gerekiyorsa, o zaman neden kabuk komut dosyası yazmak ve sonra Çalıştır (ve tabii, sonradan temizlemek) değil?

Eğer tarayıcı komut dosyasını çalıştırın sanki bu çalışır.

Linux platformu üzerinde bir proje üzerinde çalışırken bu genelinde geldi.

exec('wget http://<url to the php script>)

Bu yardımcı olur umarım!