Hola a todos, estoy haciendo un programa de php para iniciar los servicios de Mysql y Apache de mi servidor. Lo que me está sucediendo es lo siguiente, cuando se inició el servicio de mysql se me detienes la ejecución del script. Lo me mismo me sucede si inicio primero el apache. A continuación le dejo el código:
<?php
echo "Iniciamos servicios";
chdir("/xampp/mysql/bin/");
if(system('mysqld')){
echo "Servicio Mysql Iniciado";
}
echo "Iniciamos servicio de Apache 2.2";
chdir("/xampp/apache/bin");
if(system('httpd.exe')){
echo "Servicio Apache Iniciado";
}
?>
Para que corra php tiene que apache estar corriendo, no entiendo como ejecutas el php sin apache...
El php lo estoy ejecutando desde la línea de comando. El c:>xampp\php\php.exe prueba.php
Ahh ya, lo mas probable es que el apache reinicie el modulo php para asegurar su funcionamiento, tal vez el mysql haga algo similar
Después de lo que me comentaste, hice la prueba con un .bat y me sucede lo mismo. Si uno inicia no me inicia el otro y viceversa. No sé si es que tenga que colocar algo en la configuración del apache o del mysql.
@echo off
echo Iniciar.
apache\bin\httpd.exe
mysql\bin\mysql.exe
goto finish
El problema que tienes, es que ambas applicaciones tiran output cuando las llamas. Por tanto, php se queda esperando que termine el output de la primera para ejecutar la segunda.
Esto se puede solucionar añadiendo " & " al final de cada system().
system('mysqld &');
El problema, es que de igual modo, php y system() se quedaran a la espera de que finalicen estos programas para cerrarse.
La solucion es usar otro programa para iniciar los servicios. En el caso de windows, tienes el comando "start" con el parametro /b. Si los usas y ocultas la salida, te sale bien.
<?php
$services = array();
$services['mysql']='xampp/mysql/bin/mysqld';
$services['httpd']='xampp/apache/bin/httpd.exe';
foreach($services as $n=>$service){
system('start /b '.dirname(__FILE__).$service.' &',$r);
echo 'Servicio ',$n,' iniciado.',PHP_EOL;
}
?>
start /b -> Inicia el proceso en la misma ventana.
parametro $r -> es para ocultar la salida, aunque en caso de stderr, lo seguira mostrando.
dirname(__FILE__) -> El directorio donde esta el .php actual.
De todos modos PHP no fue hecho para estas cosas xD. Mirate tambien otras funciones como proc_open (http://php.net/manual/es/function.proc-open.php).
Saludos
Gracias todo trabajo Ok.
Se supone que para eso existen los servicios, debes usar el script del xampp que sirve para instalar apache e mysql como servicios, luego solo los inicias con service start apache2 && service start mysql, el tema es que ese script necesitaría permisos de root, mucho cuidado de los permisos que le des a ese script porque podrías comprometer la integridad de tu servidor, si apache corre como un usuario no www-data y como root puedes provocar que un atacante ejecute script de php desde tu pagina web como root, para eso son los servicios, ellos se encargan de iniciar los binarios con sus respectivos permisos y entornos ya que tampoco declaraste el entorno de apache ni de php.