PHPSECLIB -> exec и -> запись не заканчивается до возврата true

Я пытаюсь вызвать очень трудоемкий сценарий с конечной точки php на сервер, на котором работает matlab.

Я решил использовать phpseclib, потому что многие рекомендовали его для переносимости. Я начинаю задумываться, правильно ли я принял решение. Может быть, вы можете помочь!

Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, как я запускаю следующую команду, она всегда возвращает true до того, как завершится.

 $read = $sftp->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX);
$sftp->write("matlab -nodisplay -nodesktop -nosplash -logfile remote_matlab.out -r \"cd('/some_supporting_files'); some_function('/some_data_I_just_uploaded.txt'); exit;\"\r\n");
$read2 = $sftp->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX);

Я также попытался запустить его так:

$sftp->exec("matlab -nodisplay -nodesktop -nosplash -logfile remote_matlab.out -r \"cd('/some_supporting_files'); some_function('/some_data_I_just_uploaded.txt'); exit;\"");

Я проверил все об этом (например, файлы там, это не ошибка и т. Д.), Он запускается правильно, но просто не заканчивается. Мне нужно знать, когда он заканчивается, потому что мне нужно скачать файл, который он создает.

Если я добавлю $sftp->setTimeout(40) это работает каждый раз, но я не хотел бы, чтобы кто-то так долго ждал, если ему это не нужно, я также не могу гарантировать, что сценарий вернется к тому времени.

Как только я получу эту работу, мне все еще нужно пропинговать этот скрипт из Angular.

Вот журнал, который я получаю:

"log": [
"<-",
"->",
"<- NET_SSH2_MSG_KEXINIT (since last: 0.158, network: 0.038s)",
"-> NET_SSH2_MSG_KEXINIT (since last: 0.001, network: 0s)",
"-> NET_SSH2_MSG_KEXDH_INIT (since last: 0.453, network: 0s)",
"<- NET_SSH2_MSG_KEXDH_REPLY (since last: 0.038, network: 0.038s)",
"-> NET_SSH2_MSG_NEWKEYS (since last: 0.457, network: 0s)",
"<- NET_SSH2_MSG_NEWKEYS (since last: 0, network: 0s)",
"-> NET_SSH2_MSG_SERVICE_REQUEST (since last: 0.006, network: 0s)",
"<- NET_SSH2_MSG_SERVICE_ACCEPT (since last: 0.105, network: 0.105s)",
"-> NET_SSH2_MSG_USERAUTH_REQUEST (since last: 0, network: 0s)",
"<- NET_SSH2_MSG_USERAUTH_SUCCESS (since last: 0.071, network: 0.071s)",
"-> NET_SSH2_MSG_CHANNEL_OPEN (since last: 0, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION (since last: 0.169, network: 0s)",
"-> NET_SSH2_MSG_CHANNEL_REQUEST (since last: 0, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST (since last: 0.043, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_SUCCESS (since last: 0, network: 0s)",
"-> NET_SSH2_MSG_CHANNEL_DATA (since last: 0, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_DATA (since last: 0.036, network: 0.036s)",
"-> NET_SSH2_MSG_CHANNEL_DATA (since last: 0, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_DATA (since last: 0.037, network: 0.037s)",
"-> NET_SSH2_MSG_CHANNEL_DATA (since last: 0, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_DATA (since last: 0.036, network: 0.036s)",
"-> NET_SSH2_MSG_CHANNEL_DATA (since last: 0, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_DATA (since last: 0.037, network: 0.036s)",
"-> NET_SSH2_MSG_CHANNEL_DATA (since last: 0, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_DATA (since last: 0.034, network: 0.034s)",
"-> NET_SSH2_MSG_CHANNEL_OPEN (since last: 0, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION (since last: 0.033, network: 0.033s)",
"-> NET_SSH2_MSG_CHANNEL_REQUEST (since last: 0, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_SUCCESS (since last: 0.041, network: 0.041s)",
"-> NET_SSH2_MSG_CHANNEL_REQUEST (since last: 0, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST (since last: 0.035, network: 0.035s)",
"<- NET_SSH2_MSG_CHANNEL_SUCCESS (since last: 0, network: 0s)",
"-> NET_SSH2_MSG_CHANNEL_DATA (since last: 0, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_DATA (since last: 0.003, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_DATA (since last: 0.032, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_DATA (since last: 0.01, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_DATA (since last: 2.3551, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_DATA (since last: 0.249, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_DATA (since last: 0.059, network: 0s)",
"-> NET_SSH2_MSG_CHANNEL_DATA (since last: 17.339, network: 0s)",
"<- NET_SSH2_MSG_CHANNEL_DATA (since last: 0.041, network: 0.041s)"]

0

Решение

Ааааа! Образно ударившись головой о стену, я заметил, что каждый раз, когда я звонил $sftp->read() это сделало бы немного больше прогресса. Затем я добавил цикл do-while, чтобы остановить, когда чтение становится пустым. Это сработало!

$output->read = [];
$read = true;
do {
$read = $sftp->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX);
$output->read[] = $read;
} while ($read);

$sftp->read() вернет false, если больше нечего читать.

Мой полный код выглядит так:

$created = $sftp->write("matlab -nodisplay -nodesktop -nosplash -logfile remote_matlab.out -r \"cd('/some_supporting_files'); some_function('/some_data_I_just_uploaded.txt'); exit;\"\r\n");

$output->read = [];
$read = true;
do {
$read = $sftp->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX);
$output->read[] = $read;
} while ($read);

if(!$created){
//continue your script
}

Я до сих пор не могу заставить его работать $sftp->exec()

Хотя приведенное выше решение работает, оно перестает работать, если оно занимает слишком много времени, не давая что-то для чтения $ sftp-> read (). Я все еще надеюсь, что кто-то может решить эту проблему более надежным способом.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru