![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 2.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Chcial bym dynamicznie includowac pliki petla(chodzi o to zeby nie trzeba bylo ponownie odpalac skryptu przy zmienie jednej funkcji z includowanym pliku), PHP pluje sie ze nie mozna ponownie zadeklarowac funkcji. Wiem o tym ze mozna wykonywac evalem albo uzywac do tego "php -r" ale dla mnie to ostatecznosc. Prosze o pomoc.
Przykład:
Plik "plik.php":
Ten post edytował tracerout 2.07.2009, 14:06:46 |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
A może przykład?
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 233 Pomógł: 50 Dołączył: 28.10.2006 Skąd: Radom Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 2.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Widzisz temat? Wyraznie wpisalem "DYNAMICZNE INCLUDOWANIE".
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat PHP pluje sie ze nie mozna ponownie zadeklarowac funkcji. Zostaje Ci ew. definiowanie zmiennej jako funkcji, lambda jest tylko od PHP 5.3. Poza tym, zupełnie nie rozumiem, po co chcesz w pętli nieskończonej tę funkcję wywoływać. |
|
|
![]()
Post
#7
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
function_exists" title="Zobacz w manualu PHP" target="_manual - dzięki temu będziesz miał pewność, że nie stworzysz funkcji o takiej samej nazwie. Jeżeli jednak masz kilka funkcji o takiej samej nazwie, ale o różnej funkcjonalności, to musisz przeprojektować aplikację.
Ewentualnie spróbuj użyć include_once" title="Zobacz w manualu PHP" target="_manual, jednak nie jestem pewien, czy uzyskasz pożądany efekt. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 2.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Hmm.. sproboje jasniej:
Powiedzmy ze mam dwa pliki: start.php i inc.php. Zawartosc start.php to:
Zawartosc inc.php to:
PHP zglosi:
Po co mi to? Zebym nie musial odpalac ciagle pliku start.php jesli chce zmienic cos tylko w funkcjach z inc.php. Jesli w start.php include bylo by tylko przed while to po nim bedzie juz dostepna "jakas_funkcja()" i zwroci jako wynik "Jakis text", jesli w pliku inc.php zamienie "Jakis text" na "Jakis string" to petla nadal bedzie wyswietlala "Jakis text" dlatego chce includowac w petli zebym nie musial ciagle odpalac "start.php". Wszystko bylo by proste gdyby nie fakt ze nieda sie(przynajmniej tak mi sie wydaje) zniszczyc funkcji. Juz prosciej nie potrafie tego napisac. |
|
|
![]()
Post
#9
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Dlatego jest function exists
Kod if(!function_exists('nazwa_funkcji'))
{ function nazwa_funkcji() { } } |
|
|
![]()
Post
#10
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
~tracerout sprawdź podane przeze mnie funkcje. Powinny pomóc w rozwiązaniu Twojego problemu.
Z drugiej strony, Twoje rozumowanie jest co najmniej błędne. PHP jest językiem skryptowym, który nie wymaga kompilacji, a tym samym, nie wymaga dynamicznego ładowania funkcji, ponieważ po przeładowaniu strony/wykonaniu się skryptu, zmiany zostaną dołączone. Modyfikacja funkcji w trakcie działania skryptu nie należy do najlepszych pomysłów. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 2.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
KLIK <-- Prosze bardzo, oto jeden z przykladow, mojego autorstwa, ze PHP nie trzeba uzywac tylko w "konwencjonalny" sposob. Wystarczy na dowolnym shellu (z php) wydac komende "php jbot.php" (po edycji danych do zalogowania w pliku jbot.php ofc) i juz mamy dzialajcego przez kilka dni bota na jabbera.
A wracajac do tematu, wiem ze to nie najlepszy pomysl, biorac pod uwage to ze php ZEND(?) nie stworzylo do tego specjalnej funkcji, ale bardzo ulatwilo by to moja prace. Tak wiec ponawiam prosbe o pomoc. |
|
|
![]()
Post
#12
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
Czwarty raz piszę - sprawdź podane przeze mnie funkcje.
O samym użyciu nie będę się wypowiadał, by nie robić OT. |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 2.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
function_exists - sprawdza czy dana funkcja juz istnieje
include_once - includuje plik jesli jeszcze nie zostal zaincludowany IMHO zadna z tych funkcji niema nic wspolnego z rozwiazaniem mojego problemu bo jedna z nich zapobiega ponownemu dolaczeniu jakiegos pliku a druga pomaga zapobiedz redeklaracji funkcji. Jesli sie NAPEWNO myle, pomozcie mi to zrozumiec. Ten post edytował tracerout 2.07.2009, 15:24:17 |
|
|
![]()
Post
#14
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Powiedz, co w praktyce chcesz osiągnąć.
|
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 2.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Konkretnie potrzebuje sobie ulatwic tworzenie pewnego bota, nie moge go wylaczyc na dluzej, a jesli wylacze i wlacze z nieprzetestowanym wczesniej kodem to uzytkownicy(jest ich dosc duzo) beda mogli "pokrzaczyc" cos na serwerze lub swoich kontach(o ile w kodzie zrobie jakis blad). Nie mam mozliwosci innego testowania kodu, dlatego potrzebuje na bierzaco zmieniac tresc funkcji includowanych z pewnego pliku. Nie widze innej opcji poza includowaniem tego samego pliku podczas kazdego obiegu petli(da sie to zrobic za pomoca eval i popena ale bot musial by sie dluzej zastanowic, a przy kilku set userach niema prawa "przemyslec" nawet 1 s.
|
|
|
![]()
Post
#16
|
|
Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
A nie możesz na tym samym serwerze utworzyć kopię systemu pod jakąś domeną dostępną po podaniu hasła? Użytkownicy wciąż korzystają z dotychczasowej wersji systemu, a ty spokojnie testujesz sobie nową.
|
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 2.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
W tym problem ze nie moge. Gdyby to bylo tak proste to dawno bym to zrobil.
|
|
|
![]()
Post
#18
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
No wreszcie wiadomo, o co chodzi.
Najlepszy byłby tu właśnie bot produkcyjny. Ale jeśli już musisz, to bym kombinował z czymś takim. Partyzantka, ale cóż - nie masz serwera produkcyjnego, to będziesz musiał przeboleć. Do usmażenia jaje... ups [; Przydadzą się call_user_func" title="Zobacz w manualu PHP" target="_manual + file_exists" title="Zobacz w manualu PHP" target="_manual; raz na jakiś czas będziesz musiał zrestartować skrypt, ale to zależy od zużycia pamięci całego skryptu. Robisz coś takiego: majstrujesz bibliotekę, którą trzymasz w osobnym katalogu; pliki mają nazewnictwo lib1, lib2, itd. Co teraz? Modyfikujesz wywołanie pętli:
Przy każdej modyfikacji tworzysz nowy plik o numerku większym niż poprzedni. Jeśli istnieje - zostanie wczytany i wykonana funkcja o jego nazwie. Zaznaczam: rozwiązanie partyzanckie, stosujesz na własną odpowiedzialność. |
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 2.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Chyba jednak bede zmuszony uzyc watkow, nie moge marnowac tyle pamieci. No coz, jesli ktos wymysli cos lepszego to prosze pisac, tymczasowo zastosuje watki, najwyzej mnie userzy powiesza:P
|
|
|
![]()
Post
#20
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
A czemu nie zrobisz pośredniego wywołania do jakiejś osobnej biblioteki przez np. XML-RPC, czy SOAP? Możesz wtedy wykonywać tę samą funkcję, zmieniasz wtedy tylko skrypt serwera usługi.
|
|
|
![]()
Post
#21
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
PHP nie był stworzony do takich rzeczy. Ale jest na to rada. Oczywiście nie jest to idealne rozwiązanie i na pewno można to lepiej napisać, ale działa i nie wymaga eval-a.
Wystarczy, że zmienisz zawartość zmiennej $nazwaFunkcji i tak samo nazwiesz funkcję. Błędu nie zgłosi, nie przestanie działać, a wynik będzie widać od razu. Nie wiem jak z wydajnością - nie sprawdzałem. |
|
|
![]()
Post
#22
|
|
Grupa: Zarejestrowani Postów: 233 Pomógł: 50 Dołączył: 28.10.2006 Skąd: Radom Ostrzeżenie: (0%) ![]() ![]() |
Widzisz temat? Wyraznie wpisalem "DYNAMICZNE INCLUDOWANIE". To Ty zajrzyj jeszcze raz w swój pierwszy przykład i zastanów się, czy można z niego było wywnioskować, co chcesz osiągnąć. Do zrobienia tego co chcesz osiągnąć przyda się http://pl.php.net/manual/pl/function.override-function.php Wydaje mi się, że powinno zadziałać, ale nie sprawdzałem bo brakuje mi biblioteki. index.php
plik.php
Ten post edytował kipero 2.07.2009, 18:51:57 |
|
|
![]()
Post
#23
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Ale APD jest na mało którym serwerze...
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 16:03 |