![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 0 Dołączył: 16.12.2005 Skąd: Warszawa, Kabaty Ostrzeżenie: (0%) ![]() ![]() |
Cześć,
Piszę w PHP prosty serwer działający po socketach. Schemat działania jest prosty: 1) klient wysyła ciąg znaków z komendą, 2) serwer odbiera ciąg, 3) serwer "myśli" przez kilkanaście-kilkadziesiąt sekund, 4) serwer wysyła odpowiedź, 5) klient odbiera odpowiedź i zamyka połączenie. Sęk w tym, że mielenie w punkcie trzecim może trwać dowolnie długo i klient może w międzyczasie zamknąć połączenie, a odpowiedź zostanie wysłana na zamknięty port. Zgodnie z manualem funkcja socket_write() powinna zwrócić false w przypadku, gdy nie doszło do zapisania. Niestety, nigdy nie zwraca false, nawet jeśli klient w międzyczasie przerwie połączenie. Wymyśliłem obejście z funkcją socket_shutdown, ale to wymusza schemat: jedno połączenie, jedno zapytanie, jedna odpowiedź. Może ktoś ma pomysł co z tym fantem zrobić?
Ten post edytował DzikiLis 4.11.2007, 13:22:21 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
a nie mozesz go uruchomic w tle??np w iframe na jakiejs stronie i ktos bedzie mial wlaczona przegladarke to skrypt bedzie dalej chodzil?
-------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 0 Dołączył: 16.12.2005 Skąd: Warszawa, Kabaty Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
nie nie zle mnie zrozumiales mowilem w takim sensie ze program gdy zaczyna swoja prace uruchamia sie w iframe na stronie przez ciebie zrobiona zrob taka opcje i wtedy bedzie dalej skanowal i potem wyswietli wyniki
-------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 0 Dołączył: 16.12.2005 Skąd: Warszawa, Kabaty Ostrzeżenie: (0%) ![]() ![]() |
nie nie zle mnie zrozumiales mowilem w takim sensie ze program gdy zaczyna swoja prace uruchamia sie w iframe na stronie przez ciebie zrobiona zrob taka opcje i wtedy bedzie dalej skanowal i potem wyswietli wyniki Klient i serwer nie mają nic wspólnego ze stronami internetowymi. Skrypty uruchamiane są z poziomu powłoki, serwer nasłuchuje na innym porcie (10000), a skrypt jest wykonywany w nieskończonej pętli. Po co mam uruchomić go z poziomu przeglądarki i wsadzić do iframe? I w jaki sposób rozwiąże to problem błędnego działania funkcji socket_write? |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
ja tylko mowilem w sprawie polaczenia z klientem
-------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 115 Pomógł: 0 Dołączył: 16.04.2005 Skąd: Białowieża Ostrzeżenie: (0%) ![]() ![]() |
Kod Returns the number of bytes successfully written to the socket or FALSE one error. Tako rzecze manual... a spróbuj var_dumpnąć to, co zwraca socket_write i jakiego typu jest to wartość. Też mnie to właśnie zaciekawiło o0 -------------------- |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 0 Dołączył: 16.12.2005 Skąd: Warszawa, Kabaty Ostrzeżenie: (0%) ![]() ![]() |
ja tylko mowilem w sprawie polaczenia z klientem Hm, to klient łączy się z serwerem. Mógłbyś rozwinąć tą myśl? Kod Returns the number of bytes successfully written to the socket or FALSE one error. Tako rzecze manual... a spróbuj var_dumpnąć to, co zwraca socket_write i jakiego typu jest to wartość. Też mnie to właśnie zaciekawiło o0 W obu przypadkach (klient czeka do końca / klient się rozłącza w trakcie) var_dump zwraca int(8), czyli długość ciągu "mielenie". Testowałem połączenie lokalne (klient uruchamiany na tym samym komputerze co serwer), wywołanie z innego serwera z netu i z mojego komputera, który jest za NATem. We wszystkich trzech przypadkach jest to samo. |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 115 Pomógł: 0 Dołączył: 16.04.2005 Skąd: Białowieża Ostrzeżenie: (0%) ![]() ![]() |
Może trochę nie na miejscu... ale po cholerę serwer w PHP? To jest język skryptowy i prawie nijak się do tego nie nadaje. Odsyłam do C++
![]() Ten post edytował rolnix 4.11.2007, 18:10:59 -------------------- |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
lub ewentualnie delphi/c nie wiem jak to wytlumaczyc ale jak ja zrobilem skaner portow w php to chcialem tak zrobic zeby nikt nie musial czekac na wyniki tylko program by dzialal w tle(iframe) i jak skonczy skanowac to pokazuje wyniki
-------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 0 Dołączył: 16.12.2005 Skąd: Warszawa, Kabaty Ostrzeżenie: (0%) ![]() ![]() |
Może trochę nie na miejscu... ale po cholerę serwer w PHP? To jest język skryptowy i prawie nijak się do tego nie nadaje. Odsyłam do C++ ![]() Jasne, C++ z pewnością jest lepszy do tego typu zastosowań, ale w przypadku tego projektu spora część logiki biznesowej (to "mielenie") jest napisana w PHP. Serwer na socketach jest tylko małym dodatkiem do aplikacji internetowej, pozwalającym na dostarczanie danych do innego systemu. Przepisywanie części logiki w C++ tylko po to by chodziło szybciej i nie było językiem skryptowym niepotrzebnie narazi klienta na dodatkowe koszty. Na razie szukam rozwiązania "wystarczająco dobrego", a jeśli serwer na socketach odniesie sukces i zacznie generować przychody, zaproponuję klientowi przejście na C++. |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 115 Pomógł: 0 Dołączył: 16.04.2005 Skąd: Białowieża Ostrzeżenie: (0%) ![]() ![]() |
Uruchomienie programu napisanego w c++ to dodatkowe koszta? Człowieku, przecież i tak chcesz ten skrypt uruchamiać z shella. Co jest szybsze - interpretowanie i działanie skryptu czy działanie bezpośrednio kodu binarnego?
Może i przepisanie tego do C++ zajmie więcej czasu... ale napisałeś "po to by chodziło szybciej". Radziłbym bardziej zrobić tak, żeby w ogóle chodziło ![]() Ten post edytował rolnix 4.11.2007, 18:58:12 -------------------- |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 0 Dołączył: 16.12.2005 Skąd: Warszawa, Kabaty Ostrzeżenie: (0%) ![]() ![]() |
Uruchomienie programu napisanego w c++ to dodatkowe koszta? Człowieku, przecież i tak chcesz ten skrypt uruchamiać z shella. Co jest szybsze - interpretowanie i działanie skryptu czy działanie bezpośrednio kodu binarnego? Szybkość działania skryptu nie ma tutaj większego znaczenia. Liczba połączeń jest szacowana na 100 dziennie, potem sie może rozkręcić, jeśli klienci końcowi będą korzystać z oferowanej usługi przez ten kanał. Ale ok: szybsze w działaniu - C++, tańsze dla klienta - PHP. Przeliczyć na głos? Dopisanie serwera po socketach w PHP zajmie ~20 godzin, napisanie serwera w C++ i logiki mielącej (działającej tak samo ja ta z PHP) zajmie dobremu programiście C++ min. 100 godzin (cała logika PHP zajęła > 1200h). A, klient chce ruszać za dwa tygodnie, a nie mamy w zespole dobrego programisty C++. Którą opcję wybrałbyś na miejscu klienta? |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 115 Pomógł: 0 Dołączył: 16.04.2005 Skąd: Białowieża Ostrzeżenie: (0%) ![]() ![]() |
Wytłumaczyć mu zaistniałą sytuację. Bo - jak widzisz - w PHP to nie pójdzie...
-------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 11:04 |