Skocz do zawartości

EXEC i MySQL


dargre`

Rekomendowane odpowiedzi

W PHP wywołuje inny skrypt php przy pomocy "exec" w tle...

Na początku skryptu w tle łącze się z MySql i jest OK, mogę wykonywać operacje MySQL.

Następnie są wykonywane kolejne komendy "exec" już w trybie normalnym (mencoder, ffmpeg)

Na koniec (po wykonaniu komend) są wykonywane inne funkcje, np. usuwanie plików.

Tworzone są też mini obrazki...

A tu mój PROBLEM:

Po wykonaniu komend przy pomocy (exec), przed dalszym kodem albo po, usiłuję wykonać jedno polecenie MySql.

Bez rezultatu.... Chociaż na początku pliku nie ma z tym problemu.

Wygląda jakby @exec("$komenda 2>&1"); po wykonaniu nie pozwalała na żadne operacje mySQL.

Faktem jest, że wykonanie komendy może trwać kilka ładnych minut, albo i więcej....

Niemniej komenda jest wykonana do końca, i następujące po niej funkcje też.

Za to operacje na MySQL są niedostępne...

Zmieniłem w php.ini takie rzeczy jak: max_execution_time, max_input_time.

Dałem wartości z dużą rezerwą... I dalej nic.

Jestem prawie pewien, że pies jest gdzieś pogrzebany w ustawieniach serwera.

Otóż na jednym serwerze jest OK, ale już na drugim, trzecim nie...

Nie mogę się dokopać, co powoduje blokowanie dostępu do MySQL.

Any idea?

Sorry, nie odpowiadam na PMy

Odnośnik do komentarza
Udostępnij na innych stronach

poczytaj o takiej czymś takim jak mysql_ping w php albo mysql_theread i sprawdzaj przed wykonaniem czy masz połączenie z DB jak co to inicjuj na nowo

Aplikacje internetowe, systemy wspomagające SEO, programy pod Windows i Linux, info na https://shad.net.pl - dopisz się do Katalogu Firm

Odnośnik do komentarza
Udostępnij na innych stronach

poczytaj o takiej czymś takim jak mysql_ping w php albo mysql_theread i sprawdzaj przed wykonaniem czy masz połączenie z DB jak co to inicjuj na nowo

Eh, próbowałem łączenia.

Dla pewności rozłączałem i łączyłem się z bazą od nowa.

Dodatkowo, na swoim serwerze oprócz polecenia mysql, wykonuję kolejny exec pliku php (w tle), tego który właśnie jest wykonywany.

Jak wspomniałem - wszystko to idzie ładnie na moim serwerze.

Na innych już lipa.

Zarówno polecenie mySQL nie działa, jak i wykonanie exec tego same pliku php też nie działa (inne komendy exec, np. fl2tool2 działąją)

Więc cała rzecz nie tylko MySQL dotyczy... ale właśnie najbardziej na MySQL mi zależy...

Powiedzmy, że wygląda to tak:

<?php
require (config.php);  // wczytuję ini, łącze db i tak dalej

$sql = "UPDATE table SET field = '1' WHERE ID = xx";
mysql_query($sql);  (jest OK)

$command = "ffmpeg .....";
@exec("$command 2>&1");
//to główna komenda wykonana OK


$sql = "UPDATE table SET field = '2' WHERE ID = xx";
mysql_query($sql);
//ponowne polecenie mysql  - LIPA - NIE WYKONANE

exec($cgi.$php_path "file.php > /dev/null &"); 
//ponowne wykonanie tego samego pliku php w tle - LIPA - NIE WYKONANE)

$command = "flvtool2 .....";
@exec("$command 2>&1");
// inna komenda wykonana OK

@unlink("home..../folder/file...);
//pozostały kod - wykonany OK

?>

Sorry, nie odpowiadam na PMy

Odnośnik do komentarza
Udostępnij na innych stronach

A ffmpeg nie wyrzuca nic na stdout? może daj na wszelki wypadek 1>/dev/null jeszcze

Jaki OS?. Tylko mysql nie dziala (zwraca jakis blad?) sprawdzales?

Moze osiągasz limit procesów? Sprobuj tez shell_exec, system itp.

Spróbuj przeczytać też co zwraca exec, nie wiem ale być może da się odczytać błąd np. TOO MANY PROCESSES albo cuś podobnego.

Odnośnik do komentarza
Udostępnij na innych stronach

Linux, Centos5, 2.6.9-023stab048.4

PHP 5.2.5, Mysql 5.0.51a

Testuję to na 4 różnych serwerach, ale wszystkie to Centos5, PHP5, itp.

Jak dam "/dev/null" to pójdzie w tle, a mnie zależy żeby nie uruchamiać podobnego procesu dopóki jeden się nie skończy, i stąd właśnie całe zamieszanie...

shell_exec już było przerabiane...

Chodzi o kolejkowanie wysyłanych zadań.

W tym samym czasie ten sam skrypt może być wykonywany w tle xxx razy.

A ponieważ konwersja typu ffmpeg strasznie żre zasoby procesora, więc chciałem kolejkować ją i wykonywać tylko jedną komendę ffmpeg w tym samym czasie. Następna, dopiero jak poprzednia się skończy...

Niby mój tok myślenia jest logiczny, ale nie na wszystkich serwerach to działa.

Jakby by było zbyt dużo procesów, to czemu następne działają? np. @exec("flvtool2 ..... 2>&1");

Sorry, nie odpowiadam na PMy

Odnośnik do komentarza
Udostępnij na innych stronach

Wiec robisz sobie dodatkową tabelę np. z polem nazwa filmu{varchar}| przetworzony{enum '0','1'} | blokada{enum '0','1'}

W skrypcie do obróbki filmów wywoływanym cyklicznie cronem na początku sprawdzasz:

- czy w tabeli jest rekord z filmem i blokadą ustawioną na 1 -> jeśli jest exit; i koniec wykonywania

- jeśli nie ma żadnego pola gdzie blokada = 1 pobierasz kolejny rekord WHERE przetworzony = 0

- UPDATE blokada = '1';

- Przetwarzasz ten film kodem ...

- po skończeniu operacji UPDATE blokada = '0'; co zwalnia blokadę no i UPDATE przetworzony = '1'

itd...

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli problemem jest konf serwera/wywołanie aplikacji to prawdopodobnie, gdy skrypt dojdzie do końca - ?> następuje zabicie wszystkiego co zostało wywołanie przez tego usera(jedna instancja) przez co możesz miec wrażenie że skrypt się nie wykonuje(pisałeś że ffmpeg długo działa).

stopka usunieta z wpoodu wirusa na stronie docelowej

Odnośnik do komentarza
Udostępnij na innych stronach

Jakby by było zbyt dużo procesów, to czemu następne działają? np. @exec("flvtool2 ..... 2>&1");

Bo być może mysql_exec forkuje więcej procesów niż flvtool - bardziej zgaduje niż wiem o co chodzi :D

No ale jeśli ffmpeg rzeczywiście się kończy to ilośc procesów nie ma nic do rzeczy. Może ffmpeg niszczy jakoś środowisko?. Jeśli wykonasz

coś innego niż ffmpeg na początku to też mysql nie działa?. Spróbuj może w ten deseń to będziesz wiedział, czy wina nie leży czasem po stronie ffmpeg'a/.

Odnośnik do komentarza
Udostępnij na innych stronach

- po skończeniu operacji UPDATE blokada = '0'; co zwalnia blokadę no i UPDATE przetworzony = '1'

Ni dokładnie tak robię, mam poukładane tabele, itd.

Tyle, że właśnie to: "po skończeniu operacji UPDATE blokada = '0'" nie może być wykonane, bo mysql już nie działa...

MMP,

nie bardzo rozumien....

czemu więc jedne polecenia są wykonywane a inne nie?

jedno exec idzie, a drugie nie...

chociaż oba są ok, i sprawdzone.

Może ffmpeg niszczy jakoś środowisko?. Jeśli wykonasz

coś innego niż ffmpeg na początku to też mysql nie działa?. Spróbuj może w ten deseń to będziesz wiedział, czy wina nie leży czasem po stronie ffmpeg'a/.

Ja tu właśnie mam swoje podejrzenia.

Robiłem testy z różnymi plikami pod ffmpeg.

I np. z plikami w formacie MPEG poszło jak trzeba, a z plikami AVI(xvid), czy MP4 juz nie....

Zastanawiające jest jednak, że ten sam plik PHP, te same komendy, te same pliki filmowe na moim serwrze idą OK.

Na drugim już nie... Może wersja ffmpeg, może jakieś towarzyszące biblioteki...?

Tak czy inaczej sam plik filmowy jest konwertowany na wszystkich serwerach OK.

Nawet przy użyciu skomplikowanej, wieloetapowej konwersji do formatu x264 FLV.

Sorry, nie odpowiadam na PMy

Odnośnik do komentarza
Udostępnij na innych stronach

Zrób sobie taki test w konsoli

$ ping 127.0.0.1 1>/dev/null &

$ ps aux | grep ping // Zobacz że polecenie ping dalej się wykonuje

Wyłącz konsole

Włącz konsole

$ ps aux | grep ping // Polecenia ping już nie ma

Po wyłączeniu konsoli(w tym wypadku aplikacji) wszystko co zostało przez nią wywołanie(znak & na końcu polecenia) zostaje automatyczne zabite.

stopka usunieta z wpoodu wirusa na stronie docelowej

Odnośnik do komentarza
Udostępnij na innych stronach

Królestwo i połowę Królewny za kawałek kodu :)

Opisy słowne zazwyczaj można interpretować na kilka sposobów , kawałek kodu można zinterpretować tylko na jeden sposób.

Osobiście to nie jestem miłosnikiem "aż takich kombinacji", bo wykonywanie exec dla takich rzeczy jak autor watku to proszenie sie o problemy. Rozwiązanie Mion-a posiada zdecydowanie więcej zalet i w sumie jest proste w realizacji.

Odnośnik do komentarza
Udostępnij na innych stronach

Rozwiązanie Mion-a posiada zdecydowanie więcej zalet i w sumie jest proste w realizacji.

Najwyraźniej niechlujnie czytałeś, albo nie bardzo się orientujesz, bo dokładnie to samo robię, co kolega napisał.

A czym jest jego rozwiązanie? Update tabelki?

W tym cały pic, że update nie może być wykonany, bo komenda mysql nie działa po konwersji.

Robiłem kolejne i kolejne testy. Nic nie idzie z tym zrobić.

Nie ma innej możliwości kolejkowania zadań.

System musi wiedzieć kiedy zadanie (konwersja) się skończyła i dopiero wtedy wykonać odpowiedną instrukcję,

np. wyrzucić rekord z db i uruchomić nową konwersję wg. aktualnych rekordów czakających w kolejce.

- D.

Sorry, nie odpowiadam na PMy

Odnośnik do komentarza
Udostępnij na innych stronach

No to sprawdź czy taki algorytm jak podałem idzie oprzeć o plik tekstowty lub bazę dannych SQLite, bo IMHO coś musi działać po skończeniu tej konwersji.

A może po konwersji PHP ma błąd krytyczny przez co "przestaje działać". Odpal ten sam skrypt co wykonuje konwersję w przeglądarce i zobacz co słychać.

Jeszcze inna koncepcja jeśli masz dostęp ten sam plik przerób na uruchamiany z lini komend CLI #!/usr/local/bin/php lub #!/usr/bin/php dodaj do mysql_query($sql) or die(mysql_error()) {zakładam, że działa drukowanie błędów} uruchom w konsoli i zobacz co słychać... I w testach wywal te wylączenie bledów @.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Już ja znam te "dokładnie tak samo" dargre` :)

I te linie które są bez znaczenia.

Spróbj sie postawić w roli osoby która nie widzi Twojego projektu. Wiem wiem czepiam sie. Ale po prostu wszystko co napisałeś można zrobić na kilka sposobów, czy to połaczyć sie z baza danych , czy to wykonac SQL-a , czy tez uruchomic program (mencoder, ffmpeg)

Diabeł tkwi w szczegółach.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności