fin - php</ php
PHP: posibles obstáculos al ejecutar un script largo (2)
En primer lugar, este script no es "largo", he estado trabajando con matrices, en realidad 16 matrices con todas las que tienen más de 650 índices (= 14 X 650 = 9100 índices, nvm si estoy equivocado en el cálculo). Y se carga en una fracción de segundos, por lo que parece no tener problemas. Estoy seguro de que estás haciendo algo muy mal. Funciona bien (si lo sé correctamente) [(probado aquí en línea, en php 5)] ], incluso sin ini_set();
(deshabilitado por el sitio web) y el uso de memoery fue 63072 (en bytes ~ 63kbs ~ 0.063mb> 128mb)
¿Y quería decirte eso desde dónde estableces $current
? Su my_function()
no tiene parámetros y también le recomendaría que active los informes de errores por
error_reporting(E_ALL); ini_set(''display_errors'', ''1'');
Debería haber un problema con el compilador en línea que está utilizando, pruebe uno que usé o descargue el servidor apache, también puede probar algunos hosts gratuitos.
Tengo un bucle bastante largo ejecutándose en una función, pero no termina todas las iteraciones eventuales y se detiene sin dar ningún error:
function my_function(){
foreach (range(100,999) as $art_id){
$current++;//see bottom flush functions...
outputProgress($current, $art_id );//see bottom flush functions...
// do a lot of stuff on remote URL...
// including download images ,
// scraping HTMl etc ..
}
}
Estoy usando algunos progresos de salida con flush para seguir el progreso
function outputProgress($current, $total) {
// echo "<span style=''background:red;font-size:1.5em;color:#fff;''>" . round($current / $total * 100) . "% </span>";
echo "<span style=''background:red;font-size:1.5em;color:#fff;''>" . $current .''/''. $total . "% </span>";
myFlush();
sleep(1);
}
y
function myFlush() {
echo(str_repeat('' '', 256));
if (@ob_get_contents()) {
@ob_end_flush();
}
flush();
}
(No importa el cálculo del porcentaje, ahora está deshabilitado y solo muestra el ID de la iteración)
Me he dado cuenta de que la mayor parte del tiempo estoy ejecutando el ciclo, simplemente se detendrá después de 20-25 iteraciones. a veces tan solo 10.
Mis primeros sospechosos fueron el time limit
y el max_execution time
, así que agregué:
set_time_limit(99999);
ini_set(''max_execution_time'', 99999);
function my_function(){
foreach (range(410,499) as $art_id){ // done 500-600
set_time_limit(99999);
ini_set(''max_execution_time'', 99999);
// do a lot of stuff on remote URL...
// including download images ,
// scraping HTMl etc ..
}
}
Como puede ver, he agregado esos INSIDE
y OUTSIDE
la función en sí, por las dudas.
Pero no ayuda mucho, y el ciclo aún se detiene. Mi siguiente sospechoso era el Memory limit
, así que agregué:
ini_set(''memory_limit'',''128M'');
y como estoy trabajando en wp, también probé
define(''WP_MEMORY_LIMIT'', ''128M'');
pero fue en vano. El scipt aún se detiene después de pequeñas iteraciones.
- ¿Cuáles son las otras causas posibles de este comportamiento y los posibles remedios?
Eso sí, la secuencia de comandos no da ningún error, solo se detiene en un cierto ciclo.
EDITAR I
He pegado el guión AQUÍ . en realidad es una función scrap_slashdot () ligeramente modificada de los ejemplos incluidos en lib simplehtmldom .
Se modifica para insertar publicaciones de WordPress mientras también se descargan imágenes y se adjuntan.
EDITAR II Usando @Allendar comment echo ini_get(''memory_limit'');
parece que funciona y está configurado en 128M ..
He acelerado el usleep(50000);
Probar. Este código toma un fragmento de segundo para completarse en PHP 5.4
y no provoca pérdida de memoria:
ini_set(''memory_limit'', ''32M''); // Force back to default X/W/L/M/AMP
function my_function(){
$current = 0;
foreach (range(100,999) as $art_id){
$current++;
outputProgress($current, $art_id );
}
}
function outputProgress($current, $total) {
echo "<span style=''background:red;font-size:1.5em;color:#fff;''>" . $current .''/''. $total . "% </span>";
myFlush();
usleep(50000);
}
function myFlush() {
echo(str_repeat('' '', 256));
if (@ob_get_contents()) {
@ob_end_flush();
}
flush();
}
my_function();
echo memory_get_usage();
He agregado $current = 0;
para cancelar una advertencia dada por Xdebug.
El uso de memoria genera solo 282304 bytes (aproximadamente 275,69 kiloBytes).
Es posible que la espera de 1 segundo de cada ciclo provoque que la secuencia de comandos se cierre en el momento de la ejecución.
ini_set(''max_execution_time'', 0);
.. arreglará esto, pero no se recomienda;)
Si aún encuentra la secuencia de comandos para detenerse de repente, realmente debe ser en la parte donde tiene sus comentarios, que escribe que hay un código. Ese código podría ser lo suficientemente pesado en la carga del deamon PHP para abortar. Además de eso, también hay hosts (si el script está en línea) que te impiden establecer ini-values y quizás incluso matar el proceso de PHP si es "zombies" por mucho tiempo.