He estado luchando con un bloqueo misterioso la mayor parte del día que finalmente resolví, pero realmente no entiendo mi propia solución.

El propósito del código es reemplazar los marcadores de posición en una plantilla.

A continuación se muestra el código PHP mínimo final que necesito para reproducir el problema.

$path = realpath("path_to_template.html");
$content = file_get_contents($path);
$loop_regex = '/{{\*(\w+)}}((?:.|\n)+?){{\/\w+}}/s';
$data = array(
    "Trainees"=> array(
        array(
             "display_name" => "Joe",
             "status" => "Pending",
             "invited_date" => "01 Sep 2018",
             "percentage" => "80%"
       )
    )
);

preg_match_all($loop_regex, $content, $output_array);

Plantilla:

<table>
    <tbody>
    <tr>
        <th>Trainee</th>
        <th>Status</th>
        <th>Invited</th>
        <th>Score</th>
        <th>Action</th>
    </tr>
    {{*Trainees}}
    <tr>
        <td>{{display_name}}</td>
        <td>{{status}}</td>
        <td>{{invited_date}}</td>
        <td>{{percentage}}</td>
        <td>Some action button</td>
    </tr>
    {{/Trainees}}
    </tbody>
</table>

Todo estaba bien hasta que intenté agregar más contenido a la plantilla. De repente, ERR_CONNECTION_RESET cada vez que golpea preg_match_all.

El punto de ruptura parece estar relacionado con el tamaño del contenido dentro del grupo {{Trainees}} solamente, cuando alcanza unos 395 caracteres, se rompe.

Encontré a través de un blog de Drupal que agregar esto a Apache httpd.config lo soluciona.

<IfModule mpm_winnt_module>
   ThreadStackSize 8388608
</IfModule>

Pero realmente no entiendo por qué este código excedería el tamaño de la pila y, por lo tanto, potencialmente podría romperlo fácilmente con un poco más de contenido.

Cualquier teoría sería bienvenida.

Entorno: WAMPServer 3.0.8, PHP 5.6.25, Apache 2.4.23

3
Ross Coombes 22 ene. 2018 a las 19:15

1 respuesta

Incidentalmente, también descubrí que cambiar a PHP 7.0.10 también evitó el problema, pero eso presumiblemente enmascararía la ineficiencia en mi expresión regular original, por lo que la respuesta de Jan parecería ser la correcta.

0
Ross Coombes 22 ene. 2018 a las 17:03