Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Uruchomienie skryptu w tle.
Forum PHP.pl > Forum > Przedszkole
-AQuatro-
Witam.
Chciałbym odpalic sobie skrypcik za pomocą :
shell_exec ();
Php, czeka jednak az odpalony program ukonczy dzialanie.
Ja nie chce, aby php czekał, gdyż uruchamiany program może działać długo,
chcę aby odpalił skrypt i nie czekał na jego wynik.
Jak to zrealizować ! ?
1010
może iframe niewidoczne?

Rozumiem że chodzi Ci o ukrycie efektu ładowania strony...
Snowak
http://php.net/register_shutdown_function

Tam masz wszystko opisane... a w skrócie to ten kod zostanie wywołany dopiero po zakończeniu przetwarzania skryptu. Inaczej (elegancko) nie da rady.
-AQuatro-
Jakos jednak nie dziala to do konca.
dodałem na końcu kodu:
register_shutdown_function(shell_exec('python moj_program.py'));
I niby odpala program w pythonie.
Tyle, że czekam na zakończenie jego działania, czyli wiele się nie zmieniło.
Czyżbym coś przeoczył. ?
qrees
ignore_user_abort" title="Zobacz w manualu PHP" target="_manual - możesz zamknąć stronę, ale skrypt będzie się dalej wykonywał.
MrMag
spróbuj

  1. <?php
  2. shell_exec("./skrypt > /dev/null");
  3. header("Location: costam.php");
  4. ?>
AQuatro
/dev/null rowniez nie działa.
Takze czekam na wykonanie skryptu.

Ignore user abort, to chodzi chyba o wykonywanie skryptu strony w php ?... a nie dowolnego skryptu uruchomionego na serwerze.
Chyba jedyna nadzieja w register_shutdown_function.
Poczytam o tym jeszcze...
qrees
Cytat(AQuatro @ 4.02.2008, 08:22:08 ) *
/dev/null rowniez nie działa.
Takze czekam na wykonanie skryptu.

Ignore user abort, to chodzi chyba o wykonywanie skryptu strony w php ?... a nie dowolnego skryptu uruchomionego na serwerze.
Chyba jedyna nadzieja w register_shutdown_function.
Poczytam o tym jeszcze...

No to jak uruchamiasz skrypt php na serwerze, to możesz go uruchomić tak:
Kod
php plik.php &

Wtedy skrypt działa w tle.
MrMag
przetestowalem moja wersje i u mnie dziala smile.gif

zobacz sobie w error_log czy nie ma jakis bledow np brak praw dostepu do zrobienia czegos. pamietaj o chmodach

kopiuj
Kod
#!/bin/sh
ping wp.pl >> kopiuj.txt &


kopiuj.php
  1. <?php
  2. shell_exec("./kopiuj > /dev/null");
  3. header("Location: index.php");
  4. ?>


musi to dzialac poniewaz kiedys kopiowalem w ten sposob gigabajtowe pliki.

PS: dlatego kopiuj bo pierwotnie kopiowalem plik, ale to sie dzieje zbyt szybko. lepiej widac to na pingu smile.gif
AQuatro
Chm....
Sprawdziłem twój przykład. Również u mnie działa....
Prawdopodobnie kłopot w tym, że przesyłam do pythona jeszcze dodatkowy parametr w postaci ścieżki.
normalnie wyglądało by to tak:
Kod
python nazwa_programu.py sciezka


a w php:
Kod
shell_exec("python nazwa_programu.py ".$sciezka." > /dev/null");

Ale to nie działa.

Nie wiem dlaczego nie działa również opcja:
Kod
shell_exec("python nazwa_programu.py ".$sciezka." &");

Czyli mimo iż na końcu daję symbol odpalenia w tle, to i tak czekam na wykonanie skryptu pythona.

Jedynym rozwiązaniem było by chyba zrobić skrypcik w bashu, tak jak ty zrobiłeś z przykładem pinga, i w nim komendę uruchomienia skryptu pythona w tle.
Tyle, że do skryptu w bashu musialbym przesłać w jakiś sposób scieżkę za nazwą ...
A nie wiem jak bash przechwytuje kolejne parametry po nazwie...
MrMag
pamietam, ze tez mialem problemy z parametrami bo cos nie lykalo. jak to rozwiazesz to daj znac bo wkrotce znow bede musial wykorzystac odpalanie skryptu w tle.

w bashu odwolanie do parametrow: $1 $2 itd.

PS: zdaje sie, ze jak mialem w nazwie pliku jakiekolwiek rozszerzenie to byly problemy. nie jestem tego pewien, ale mozesz sprawdzic.

moze sproobj najpierw utworzyc zmeinna z ciagiem polecen i daj exec na zmiennej?

PS2 winksmiley.jpg jednak lyknelo parametr bez problemu. niestety na pytonie sie nie znam. a to dev null zdaje sie bylo istotne.
AQuatro
No, działa.
Ale musiałem zrobić, tak jak zrobiłeś z pingiem.
Osobny plik, skrypt w bashu.
plik.sh
Kod
#!/bin/sh
python nazwa_programu.py $1 &


i w php:
Kod
shell_exec("sh plik.sh ".$sciezka."> /dev/null");


Wtedy zadziała.
Bez basha się nie obejdzie.
Próbowałem nawet zapisać
Kod
shell_exec("python nazwa_programu.py  ".$sciezka." & > /dev/null");

Ale zawsze czeka na wykonanie kodu.
Ale ogólnie, problem rozwiązany..
Dzięki za wszelkie sugestie.
qrees
Czyli tak jak mówiłe, trzeba na końcu dodać &, i skrypt jest wykonywany w tle...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.