php nasıl harici bir program yayınlanmaya başlar - sistemi ve exec ile sorun yaşıyorsunuz

2 Cevap php

Ben kontrollü, xp, intranet yalnızca bir ortamda çalışan ve ben bir PHP uygulamalarında harici işlemleri başlatmak gerekir. (Yedekler Raporları vb)

Ben sessizce çalışan bir süreci başlatmak için sistem veya exec alabilirsiniz. İşte basit bir örnek

<?php exec ("echo hello > hello.txt");?>

Ben hiçbir görünür çıkışı olan bir bat dosyası çalıştırmak için alabilirsiniz.

Ben böyle bir rapor jeneratör veya not defteri olarak çalıştırmak için bir ekrana sahip herhangi bir program alamıyorum ...

<?php exec ("explorer");?>

şey yapmaz. ya da sistem için aynı

2 Cevap

Ne davranış bekliyoruz? system('notepad') çalışıyor çağırıyor - sadece GUI görüntüler değil. Bu arka planda çalışır ve PHP kendini kapatmak için sabırla not defteri bekliyor oturur (ve süreç listeden not defteri öldürmek yalnızca devam eder).

Eğer bir GUI açılır bekliyorsanız eğer, ben bunu yapamam ki oldukça eminim. Bir seçeneği ;) (file_put_contents('runme.bat', 'notepad hello.txt')) bir toplu komut dosyası yazmak için olması ve toplu iş komut dosyası bir zaman uyumsuz şekilde çalıştırmak için (Windows zamanlayıcı veya ne olursa olsun cron eşdeğer Windows üzerinde) ile kuyruğa (ve net olabilir sonunda kendisini).

Çok geç cevap, ama kendimi bu konuda çalışan ve Windows XP üzerinde Apache sunucu PHP ile bir GUI programı çalıştırmak için gerçekten mümkün olduğunu bulundu.

  • Başlat-> Çalıştır, türü Hizmetler kontrolünü getirmek için "services.msc" (oraya başka yollar, bu IMO kolayıdır)
  • Apache hizmetini bulun (mayın WampServer 2.0 kullanarak "wampapache" denirdi)
  • Hizmet özelliklerini açın (çift tıklayın veya sağ tıklayın-> özellikler)
  • Hesap günü günlüğüne çevirin ve "hizmet Masaüstü ile etkileşime izin ver" başlıklı onay kutusunu sağlamak checked
  • Genel sekmesinde geri çevirmek, hizmeti durdurmak, hizmeti başlatmak

Şimdi, aşağıdaki kodu kullanarak, PHP UI süreçleri spawn. İlk kod parçasında, komut kapatmak için uygulama için beklemek olmaz; Program (engelleme) devam etmeden önce kapatmak için ikinci pasajı bekler.

Uygulama için beklemeyin:

pclose(popen("start /B notepad.exe", "r"));

Uygulama için bekleyin:

system('start notepad.exe');

Bu, Windows XP üzerinde test edilmiştir. Ben senin millage değişebilir, başka herhangi bir Windows sürümleri üzerinde denemedim.

Side note On my particular installation, I was using the other option in the Log In tab of the service - Apache was running as a domain user so it could access several network shares with domain user permissions. The checkbox isn't available for that option, only when the service is running as Local System. After extensive research, I've found that there is simply no way for a single service to both interact with the current desktop AND utilize the credentials of a specific user. It's a one-or-the-other proposition, with the suggested remedy being to split your service into two components - one that uses the user account privs and one that interacts with the desktop. Not very practical when the service you're talking about is the web server. This note is probably pretty specific to my use case, but I wanted to put it out here in case I can save someone else the frustration in the future.