2010-04-19 14 views
6

Mam kilka prawdziwych problemów z opóźnieniem wyprodukowanym przy użyciu fgets, aby pobrać odpowiedź serwera na niektóre wywołania baz danych wsadowych, które robię.PHP najszybsza metoda odczytu serwera odpowiedzi

Wysyłam przez partię powiedzmy, 10 000 połączeń i śledzę opóźnienie w dół do fgets, powodując zatrzymanie w szybkości mojej aplikacji, ponieważ odpowiedź na każde wezwanie musi zostać złapana.

Znalazłem ten wątek http://bugs.php.net/bug.php?id=32806, który wyjaśnia problem całkiem dobrze, ale czyta plik, a nie odpowiedź serwera, więc fread może być nieco podstępne, ponieważ mogłem dostać część następnej linii, i dodatkowe rzeczy, które nie mogę nie chcę.

Moje pytanie brzmi: jaki jest najlepszy/najszybszy sposób odczytania odpowiedzi z serwera jako alternatywy dla fgets?

+0

o co pytasz? język php nie ma nic w stylu przetwarzania prędkości, ale ten język nie jest dla. – Svisstack

+0

Czy możesz pokazać kod? Jakiego rodzaju są to bazy danych? –

+0

to są połączenia z serwerem Redis NoSQL –

Odpowiedz

0

Za mało informacji tutaj.

Prawdopodobnie masz na myśli, że używasz jakiegoś PHP gdzieś, który wywołuje fgety do odczytu danych z czegoś innego - ale co to jest coś innego? Mówisz, że to nie jest plik - więc co to jest? Lokalny program? rura? gniazdo sieciowe? strona internetowa? ... coś innego?

Czy można szybciej odczytać za pomocą innego narzędzia? Co próbujesz? Jakiego systemu operacyjnego używasz? Czy masz dostęp do powłoki, aby uruchomić netcat lub coś podobnego?

Mówi się również o opóźnieniu, podczas gdy "błąd", do którego się odnosi, głównie dotyczy przepustowości.

Nie wiedząc o wiele więcej na temat problemu nie można zaproponować rozwiązania.

C.

+0

Oczywiście, dobre punkty - przy użyciu szkieletu PHP (Predis) do interakcji z bazą danych Redis. Wydaje się, że kiedy wysyłam partię komend za pośrednictwem połączenia gniazda z PHP do Redis, fgety używane do odczytu odpowiedzi serwera Redis powodują opóźnienie. Zasadniczo framework Predis wykorzystuje fgets do odczytywania odpowiedzi z serwera i tam właśnie spędzany jest cały czas - w wysyłaniu i odbiorze danych przez kabel. –

+0

Następne pytanie brzmi: skąd wiadomo, że problem dotyczy końca PHP? Czy przetestowałeś go z innym klientem? Czy próbowałeś uruchomić gniazdo jako nieblokujące? – symcbean

+0

Czy jesteś pewien, że opóźnienie jest w PHP, a nie po stronie bazy danych. –

2

file_get_contents (lub stream_get_contents jeśli masz strumień) powinien być najszybszy sposób, aby przeczytać odpowiedź serwera. Cóż, jest to najszybszy sposób na odzyskanie danych, ale często jest to najbardziej nieekonomiczny sposób, gdy patrzymy na użycie pamięci, ponieważ odczytuje on cały plik w pamięci, podczas gdy fgets nie musi przechowywać więcej niż jedną linię w pamięci.

Używasz również freadu, który jest szybszy niż fgets i który odczytuje plik w porcjach o określonym rozmiarze, który możesz zdefiniować.

Jeśli zależy Ci na czytaniu danych, możesz użyć pliku(), który będzie wolniejszy od file_get_contents, ale da ci tablicę z liniami pliku.

Aby dać ci lepszą odpowiedź - już wspomniano powyżej - potrzebujemy więcej informacji.

Powiązane problemy