Ya determine en parte por que se presenta el error.
La imagen docker que estaba utilizando es basada en Alpine Linux 3.7 con la instalación de los paquetes Apache2 y PHP propias de la distribución. Solo por probar, cree una imagen basada en Centos7 con los paquetes PHP
https://webtatic.com/packages/php56/ tan como lo es indicado en la wiki y todo funciono correctamente, por seguir probando cree otra imagen esta vez basada en Debian 8 con los paquetes Apache2 y PHP propias de la distribución y lo mismo, funciona correctamente. Mi cara fue de
. No me quede con esto solamente, así que me puse a analizar por que en Alpine Linux 3.7 no funcionaba.
Las versiones de PHP en las 3 distribuciones son prácticamente las mismas 5.6.36 o 5.6.37, y me asegure que en las 3 estuvieran presente los mismos módulos y extensiones.
Encontré que el error se presenta al momento de construir los Endpoint del servicio REST en el archivo "framework/src/Maveriks/WebApplication.php", especificadamente en el bucle de la linea 323 (tomando el soruce code de processmaker 3.2.1) y la llamada que implementa a la función glob en la linea 321 que carga las clases implementadas en el directorio "workflow/engine/src/ProcessMaker/Services/Api/".
Mas en concreto el problema se origina por que la funcion glob (
https://secure.php.net/manual/en/function.glob.php) en Alpine Linux, digamos que "normaliza" los paths que retorna eliminado los caracteres no necesarios y el bucle en la linea 323 parece que espera que los path tenga el carácter extra por lo tanto no determina bien los path ni lo carga. Esto no sucede en Centos y debian ya que el retorno de la de la fusión glob no "normaliza" los path's.
Para que tenga una idea mas clara, le represento las salidas y Ajunto una imagen con las lineas de código en cuestión:
La variable $apiDir en este punto esta llegando con el el string "/opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api/". Vean que tiene un separador de directorio "/" de mas entre " processmaker" y "workflow".
En contenido de la variable $classesList en 321 en Debian y Centos queda mas o menos así:
Code: Select allArray
(
[0] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//ActionsByEmail.php
[1] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//Calendar.php
[2] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//Cases
[3] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//Cases.php
[4] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//Catalog.php
[5] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//Consolidated.php
[6] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//Dashboard.php
[7] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//Department.php
[8] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//EmailServer.php
[9] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//File.php
[10] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//GmailIntegration.php
...
)
Y en Alpine linux queda mas o menos así:
Code: Select allArray
(
[0] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//ActionsByEmail.php
[1] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//Calendar.php
[2] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//Cases
[3] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//Cases.php
[4] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//Catalog.php
[5] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//Consolidated.php
[6] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//Dashboard.php
[7] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//Department.php
[8] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//EmailServer.php
[9] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//File.php
[10] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//GmailIntegration.php
...
)
Fijence que Alpine Linux es removido el caracter de mas y el path es "normalizado". Por lo que en la linea 325 no es eliminado parte del string como se espera, ya que la variable $servicesDir contiene "/opt/processmaker//workflow/engine/src/ProcessMaker/Services" con el caracter de mas.
Se que la sigueinte pregunta no tiene que ver con los temas que se tocan en este foro, pero tendran alguna idea de ¿por qué la función glob se comporta de forma distinta en Alpine linux?
Como programador, prienso que hay que tener cuidado de como se maneja los string que repretanan los path del sistema y asegurarse de "normalizarlos" antes de hacer alguna comparación.
De antemano muchas gracias por su ayuda.