Прекратить зацикливание и вывод, а затем продолжить php

Хорошо, я думаю, пришло время спросить здесь мой сценарий,

У меня есть большой массив, и я хочу зациклить его, а затем остановить его, когда дело доходит до определенного количества, а затем продолжить зацикливание, вот пример сценария,

$result_array = array();
$locations = //array of locations coming from a XML SOAP respond;

foreach($locations as $loctn){
    //Request of the XML,
    $result = //A large array coming from a XML SOAP respond;

    foreach($result as $val){
        $result_array[] = 'somkey' => $val->identifcator,
                          'somkey1' => $val->language,
                          'somkey2' => $val->textSubjectQualifier,
                          'somkey3' => $val->companyId,
                          //etc.
    }
}

print_r($result_array);

Таким образом, первый массив взят из ответа XML, и я снова зацикливаю его с указанием местоположений, и его запрос снова из XML, и я снова зацикливаю его в другой массив, а затем я хочу вывести последний массив за пределы цикла,

Но у меня возникли проблемы, потому что это очень большой массив, и если массив не такой большой, он получается хорошим, но когда я хочу увеличить его, я не получаю никакого результата, потому что браузер останавливает его,

Я пытался поиграть с памятью, но это не решило мою проблему, поэтому я думаю, что лучше всего было бы остановить массив, а затем вывести его, а затем продолжить цикл, но я не знаю, как это сделать,

Пожалуйста, помогите мне с этим

Спасибо

 thegrede17 июн. 2012 г., 18:01
Нет, я думаю, что я должен что-то сделать в сценарии, это должно быть сделано здесь, потому что обычно я знаю из своего опыта, если я что-то изменяю в файле, чем я обнаружил, что я могу сделать это в сценарии самостоятельно.
 Haroon17 июн. 2012 г., 18:03
CLI означает запуск сценария в командной строке. Таким образом, вы все еще можете иметь тот же сценарий, но на стороне CLI. Это позволит вам долго запускать скрипт, который, я думаю, вам нужен.
 thegrede17 июн. 2012 г., 18:09
Это была ошибка при написании, просто исправили,
 Viacheslav Kondratiuk17 июн. 2012 г., 18:07
Не понятно, почему в циклеforeach($resustl as $val){ Вы не используете его значения.
 Haroon17 июн. 2012 г., 17:58
Это похоже на то, что, вероятно, должно быть сделано на стороне CLI. Это возможно для вас? Я предполагаю, что скрипт останавливается из-за достижения максимального времени выполнения (это значение обычно находится в файле PHP.ini (max_execution_time).

Ответы на вопрос(2)

m having trouble here because its a very large array, and if the array not so big it comes out good but when I want to make it bigger then I got no result because the browser stops it,

звучит так, как будто вы попали в тайм-аут выполнения (как упомянуто @Haroon). Возможно, вы захотите просмотреть свой журнал ошибок или проверить, не прошел ли запрос со статусом 500 (Внутренняя ошибка сервера).

set_time_limit () позволяет (пере) установить время выполнения по вашему усмотрению. Но если ваш сценарий выполняется более 30 секунд (что должно быть значением по умолчанию для времени ожидания выполнения), вы можете изучить альтернативный маршрут создания этого массива.

foreach($locations as $loctn){
//Request of the XML,
$result = //A large array coming from a XML SOAP respond;

Похоже, вы извлекаете данные из веб-службы. Это также звучит так, как если бы вы были (для большого набора предметов в$locations) делать довольно много запросов на этом веб-сервисе.

Доступ к веб-сервисам может быть медленным. если у вас есть какой-либо способ сделать это вне вашего процесса («очередь заданий», что-то с заданием cron, & # x2026;), сделайте это. Также проверьте, могут ли данные, предоставленные веб-сервисом, быть кэшированы и использованы повторно.

 thegrede17 июн. 2012 г., 18:33
Я пробовал несколько разset_time_limit() функция не решила мою проблему, потому что когда яprint_r() функция в цикле, то это нормально, проблема возникает, когда я помещаю ее вне цикла, и о веб-сервисе я могу сделать, сколько запросов я хочу, я уже пробовал, спасибо в любом случае за вашу помощь, :)
echo str_repeat(' ', 4096); // you need this or something similar, because most of browsers don't print anything if they don't have enough to parse

foreach (...) {
...
    foreach (...) {
        ...
        print_r($result_array);
        flush(); // echo the buffer
    }
}

пока не получит достаточно данных, поэтому существует функция str_repeat ().

Из руководства по PHP:

flush() may not be able to override the buffering scheme of your web server and it has no effect on any client-side buffering in the browser. [...]

Server modules for Apache like mod_gzip may do buffering of their own that will cause flush() to not result in data being sent immediately to the client.

Even the browser may buffer its input before displaying it. Netscape, for example, buffers text until it receives an end-of-line or the beginning of a tag, and it won't render tables until the tag of the outermost table is seen.

Some versions of Microsoft Internet Explorer will only start to display the page after they have received 256 bytes of output, so you may need to send extra whitespace before flushing to get those browsers to display the page.

Попытка исправить ваш код:

echo str_repeat(' ', 4096);
$result_array = array();
$locations = //array of locations coming from a XML SOAP respond;

foreach($locations as $loctn){
    //Request of the XML,
    $result = //A large array coming from a XML SOAP respond;

    foreach($result as $val){
        $result_array[] = 'somkey' => $val->identifcator,
                          'somkey1' => $val->language,
                          'somkey2' => $val->textSubjectQualifier,
                          'somkey3' => $val->companyId,
                          //etc.

        print_r($result_array);
        flush();
    }
}

Этот код должен печатать $ result_array каждый цикл.

 thegrede17 июн. 2012 г., 18:19
echo str_repeat(' ', 4096); по-другому, или это должно быть со всем сценарием?
 thegrede17 июн. 2012 г., 19:10
Хорошо, я знаю, что это работает, но я хочу распечатать его вне цикла, и оно не работает, но я очень ценю вашу помощь, большое спасибо, :)
 17 июн. 2012 г., 19:11
Почему вы хотите печатать вне вашей петли? Вы пробовали мой код? Я думал, что вы хотите напечатать свой $ result_array каждый раз, когда вычисляете его, вместо того, чтобы ждать конца. Извини :(
 17 июн. 2012 г., 19:09
Я снова исправил свой пост. Два цикла foreach, которые я поставил, были ВАШИМИ циклами foreach (без условий и т. Д.) :)
 thegrede17 июн. 2012 г., 18:52
Почему вы поместили два цикла foreach, мне нужно поместить функцию flush в цикл моего примера или сделать еще один цикл, и поэтому я не понимаю, что вы сделали для циклов foreach, спасибо за ваше время,

Ваш ответ на вопрос