![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 1 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
Jak to jest w ogóle możliwe?
![]()
Problem dotyczy bardzo długich tekstów z zagnieżdzonymi synonimami, przy krótkich wydaje się że jest ok. Mój ma 86188 znaków, jest w nim 100 zdań i losuje się jedno z nich. Dodatkowo każdy wyraz ma synonimy. Po wysłaniu na serwer wszystko działa jak trzeba. Natomiast gdy odpalam to na domowym komputerze (zainstalowany VertrigoServ) źle miesza. W kółko wyskakuje około 5 dokładnie takich samych zdań. Najlepsze jest to, że zawsze pojawiają się w tej samej kolejności! Jakim cudem tak się dzieje? ![]() Ten post edytował robert-s 26.06.2012, 21:47:14 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 87 Pomógł: 3 Dołączył: 15.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Ja bym pierwsze sprawdził wersje PHP ;p Najlepiej zainstalować najnowsze. Możliwe że w tej wersji która jest w VertrigoServ jest za stara i któraś z funkcji ma trochę inne działanie..
-------------------- "Zło do triumfu potrzebuje tylko tego, aby dobrzy ludzie nic nie robili" |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 1 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
Najnowsza była. Zresztą teraz zmieniłem na WAMPSERVER i to samo. Musi być jakieś racjonalne wyjaśnienie... Na hostingu losuje jak trzeba. U mnie na localhost zachowuje się jakby zapamiętał kilka wyników i wyświetlał kolejno
![]() Ten post edytował robert-s 26.06.2012, 22:57:58 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 479 Pomógł: 97 Dołączył: 6.09.2011 Skąd: php.net :) Ostrzeżenie: (0%) ![]() ![]() |
Nie zagłębiałem się w kod ale to, że pojawiają się w tej samej kolejności prawdopodobnie wynika z wersji PHP bo chyba od 5+ array_rand nie miesza zwracanej tablicy, dodaj po:
i sprawdź czy zmieni się cokolwiek. -------------------- Manual prawdę Ci powie.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 1 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
Częściowo pomogło tzn. z tych 100 zdań losują się już wszystkie. Jednak dla danego zdania zawsze losowane są te same synonimy. I nie ma reguły, że jest brany zawsze np. pierwszy wyraz z {wyraz 1|wyraz|2wyraz 3}, ale przy drugim, trzecim itd wylosowaniu danego zdania zawsze wygląda ono tak samo. Znowu problem z zagnieżdżeniami występuje tylko przy dużej ilości tekstu. Przy 5 zdaniach jest ok. Sprawdzane tylko lokalnie, na serwerze już nie mogę bo domownicy się burzą, że nie mogą spać
![]() Ten post edytował robert-s 26.06.2012, 23:32:43 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 195 Pomógł: 109 Dołączył: 3.11.2011 Ostrzeżenie: (10%) ![]() ![]() |
Spróbuj w funckcji mixText za liniką:
$elements = explode($this->delimiter, $text); dodać SLEEP(10); mianowicie: Poza tym masz literówke: str_ireplace-co to za polecenie? Ten post edytował Niktoś 27.06.2012, 00:24:37 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
@Niktoś:
str_ireplace @robert-s: Spróbuj użyć tego (konieczne PHP 5.3):
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 1 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
SLEEP odpada, bo skrypt wykonuje się niemiłosiernie długo przy długich zdaniach. Zawsze Timeout, więc nawet nie mogę porównać.
W nawiązaniu do wersji bez żadnych modyfikacji. Hosting z wersją PHP 5.3.1326. Działa dobrze. Hosting z wersją PHP 5.2.17 również. WAMPSERVER PHP 5.3.13 w kółko w wyniku daje dokładnie 9 tych samych zdań. Dodanie shuffle($elements); u mnie na localhost poprawia nieco losowość, ale i tak jest bardzo słaba. Dochodzi trochę zdań, ale na pewno nie losują się z całej puli. Z synonimów zagnieżdżonych prawie zawsze losuje się to samo. To jest przykładowy plik zawierających dwieście wygenerowanych linijek i posortowanych według długości. Proszę się nie przestraszyć, bo to jest bełkot, niemniej pokazuje problem: https://dl.dropbox.com/u/46580461/zlemieszanie.txt Dla porównania plik wygenerowany tym samym kodem, na hostingu z PHP 5.3.1326 https://dl.dropbox.com/u/46580461/dobremieszanie.txt I na szybko zrobiony pliczek, który generuje te 200 linijek razem z tekstem źródłowym: https://dl.dropbox.com/u/46580461/mieszacz.php W zasadzie powinienem się cieszyć, że kod dobrze działa w miejscu docelowym, ale... Sytuacja jest dla mnie niezrozumiała ![]() |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 195 Pomógł: 109 Dołączył: 3.11.2011 Ostrzeżenie: (10%) ![]() ![]() |
Może zrób sobie experyment. Na localchoście póść np 30-40 razy w pętli losowanie dużej liczby i wyświetl to.Zrób to samo dla rand(),srand() i mt_rand(). Zobaczysz efekty i różnice.
Coś takiego:
Potem przed $dane spróbuj dodać polecenie sleep(). Ten post edytował Niktoś 27.06.2012, 10:09:36 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 1 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
Nie widzę jakiś różnic. We wszystkich przypadkach liczby są dobrze losowane, bez takich powtórzeń. Przy sleep też.
Kod phpion'a daje taki sam efekt jak w załączonych wyżej plikach. Pewnie wina leży w konfiguracji i złym działaniu array_rand, tylko gdzie dokładnie? Znamienne jest to, że błąd objawia się przy dużym obciążeniu (długi tekst z synonimami zagnieżdżonymi). Można w jakiś elegancki i wydajny sposób zastąpić array_rand? Edit: Problem rozwiązany przez napisanie zupełnie innego kodu bez array_rand. Niemniej jakby ktoś znał prawdopodobną przyczynę takiego stanu rzeczy, niech da znać. Ten post edytował robert-s 27.06.2012, 13:23:25 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 13.06.2025 - 13:34 |