Cytat
Moje pytanie to, czy jest jakaś możliwość wydłużenia czasu działania skryptu bez ingerencji w serwer lub czy macie pomysł na inne rozwiązanie
Gdyby można było z poziomu kodu zmieniać czas działania skryptu (ograniczony ustawieniami serwera) to zaraz któryś z nieskończoną pętlą zająłby zasoby serwera, dlatego tego parametru nie ruszamy. Skrypty muszą wykonywać się w określonym czasie.
Cytat
Z Ajax'a jestem 0
Ojojoj nie odrobiło się zadania domowego

Minęło już kilka miesięcy, a sytuację masz dokładnie taką samą jak w przypadku
pobierania danych zamówień 
Właściwie do wykorzystania masz ten sam kod. Podmień tylko nazwy funkcji, identyfikatorów HTMLowych i dane w sekcji jQuery.ajax({ }); skryptu JSowego. Główną funkcję (tą którą będzie wywoływał AJAX, czyli apaczka_request() w starym kodzie) musisz podmienić na funkcję działającą logicznie w taki sposób:
0. Zakładam, że upload już sobie ogarniesz. Pamiętaj o sprawdzaniu poprawności wgranego pliku oraz przesłanych przez AJAX danych ($_POST)!
1. Otwórz zuploadowany plik.
2. $offset = $_POST['offset']; i korzystasz z
fseek, aby ustawić wskaźnik pliku w miejscu ostatniego odczytu ( dlatego na początku = 0 )
3. while ( !
feof($file) )
4.
fgetc i doklejasz do stringa (konkatenacja)
5. Sprawdzasz czy wystąpił znak oznaczający koniec "paczki" danych, czyli takich które dotyczą jednego wpisu (w przypadku CSV jest to chyba znak nowej linii \n, zatem mógłbyś ułatwić sobie zadanie i w pkt 3. użyć
fgets, ale w przypadku XMLa nie jest to takie oczywiste, bo zoptymalizowany może nie mieć znaków końca linii)
6. Jeśli odczytano "paczkę" danych to inkrementujesz jakiś licznik i: if( $counter == 20 ) break; która spowoduje przerwanie pętli i odczytywanie dalszych znaków/linii
7. Sprawdzasz, czy odczytano cały plik, np. ponownie sprawdzasz feof, albo korzystasz z jakiejś zmiennej logicznej
8. Jeśli koniec pliku to echo 0;
9. Jeśli nie to za pomocą
ftell sprawdzasz aktualną pozycję wskaźnika pliku i przesyłasz ją jako odpowiedź serwera (echo)
10. Zamykasz plik
11. Robisz z danymi co potrzeba (powinno to być optymalne, żeby nie zajmowało cennego czasu)
12.
dieW sekcji ajaxowej dajesz success : function(response){ offset=response; if(!isNaN(offset) && parseInt(offset) > 0){ jQuery.ajax(this); } } co spowoduje, że jeśli są jeszcze jakieś dane do odczytania AJAX wykona się kolejny raz, tym razem z powiększoną zmienną offset.
Ponadto jeśli gdziekolwiek wystąpi błąd to zadbaj, żeby wyświetlił jakąś liczbę ujemną inaczej ajax mógłby się zapętlić. Dodatkowo masz sprawdzanie w JS, czy skrypt zwrócił liczbę.
Generalnie skrypt będzie z każdym odpaleniem czytał jedynie fragment pliku, przekazywał miejsce, do którego doczytał i kończył wykonywanie, dlatego powinieneś dobrać tak ilość danych do odczytania, żeby zdążył przed timeoutem, ustawienie zbyt małej ilości może jest bezpieczne, ale wydłuży czas całego procesu. Później ten sam skrypt odpali się ponownie, ale zanim zacznie czytać przesunie wskaźnik tam gdzie poprzednio skończył i znowu odczyta część danych.
Najlepiej jeśli rozbijesz odczytywanie osobno dla plików XML, a osobno dla CSV, ponieważ różnią się one znacznie, a CSV można bardzo szybko rozkładać, co warto wykorzystać.