Ok vamos por partes, primero que nada te diré que considero esto del script en Python personalmente innecesario porque PHP tiene las capacidades de hacer conexiones FTP y mover archivos masivamente tal cual un CLI.
El llamar a un aplicativo de terceros puede traer inestabilidad o algún error no controlado, interrumpa la correcta ejecución del sistema.
Como invocar un archivo Python para su ejecución:
- Evaluar desde que sistema estas y/o vas a ejecutar el script:
<?php
// Ruta al archivo Python
$pythonScript = 'python_test/transfer_FTP.py';
// Verificar el sistema operativo actual
$os = strtoupper(PHP_OS_FAMILY);
// Comando para ejecutar el script Python según el sistema operativo
if ($os === 'WINDOWS') {
// Comando para Windows
$command1 = 'powershell -Command "Get-Command python"';
$command2 = "python $pythonScript";
} else {
// Comando para Linux y macOS
$command1 = "command -v python";
$command2 = "python3 $pythonScript";
}
Nota: hasta este punto ya hemos determinado el Sistema Operativo y el comando que queremos ejecutar.
- Antes de ejecutar el comando, debemos validar que este es un comando existente en el sistema:
$output = shell_exec($command1);
// Verificar si la salida contiene la información de la versión de Python
if (strpos($output, 'Python') !== false) {
echo "Python está instalado en tu sistema.";
//Metodo que ejecuta tu archivo py
runPY($command2);
} else {
echo "Python no está instalado en tu sistema.";
//Mensaje de Error controlado para el output.
}
Output en Windows test terminal:
![introducir la descripción de la imagen aquí](https://cdn.statically.io/img/i.sstatic.net/2fwnZ3iM.png)
- entonces se viene el método para ejecutar el comando...
function runPY(string $command)
{
$output = shell_exec($command);
var_export($output); // unsa salidita de datos para ver que fue lo que paso en la ejecucion.
}
Ref php-os-family
: https://www.php.net/manual/en/reserved.constants.php#constant.php-os-family
Ref polyfill antes de php7.2:
https://github.com/symfony/polyfill/blob/1.x/src/Php72/Php72.php#L70
Ref shell-exec
:
https://www.php.net/manual/en/function.shell-exec
Nota: As-is esta implementación no pude probarla porque no tengo PHP instalado.
PHP y su forma nativa de mover archivos:
Como te decía, PHP tiene su forma nativa de hacer lo que intentas con el script Python:
<?php
// Configuración de conexión FTP
$ftp_server = "ftp.example.com"; // Cambia esto al nombre de tu servidor FTP
$ftp_username = "tu_usuario"; // Cambia esto a tu nombre de usuario FTP
$ftp_password = "tu_contraseña"; // Cambia esto a tu contraseña FTP
// Directorio remoto y local
$remote_dir = "/directorio_remoto"; // Cambia esto al directorio remoto que deseas descargar
$local_dir = "/directorio_local"; // Cambia esto al directorio local donde deseas guardar los archivos descargados
// Establecer conexión FTP
$conn_id = ftp_connect($ftp_server);
if (!$conn_id) {
die("No se pudo conectar al servidor FTP");
}
// Iniciar sesión FTP
$login_result = ftp_login($conn_id, $ftp_username, $ftp_password);
if (!$login_result) {
die("Error al iniciar sesión en el servidor FTP");
}
// Cambiar al directorio remoto
if (!ftp_chdir($conn_id, $remote_dir)) {
die("No se pudo cambiar al directorio remoto: $remote_dir");
}
// Obtener lista de archivos en el directorio remoto
$files = ftp_nlist($conn_id, ".");
// Descargar archivos uno por uno
foreach ($files as $file) {
// Nombre de archivo local
$local_file = $local_dir . "/" . basename($file);
// Descargar el archivo
if (ftp_get($conn_id, $local_file, $file, FTP_BINARY)) {
echo "Archivo descargado correctamente: $file<br>";
} else {
echo "Error al descargar el archivo: $file<br>";
}
}
// Cerrar conexión FTP
ftp_close($conn_id);
IMPORTANTE: para que tanto el invocado del archivo PY o el método nativo FTP funcione, apache, nginx, iis o cualquiera que sea el servicio web que ejecutara el archivo .php
, tanto el servicio como el usuario owner del servicio deberán tener permisos y privilegios de ejecución y escritura para poder poner los archivos en el directorio local, de lo contrario es posible que salte un error de permisos o no ocurra nada ...