Как обсуждалось в ответе на на этот вопрос , распространенным методом является инициализация стека с известным значением, а затем некоторое время запускать код и смотреть, где останавливается паттерн.
У меня аналогичная проблема. Я предполагаю, что вы делаете что-то похожее на это:
$dir = "ssh2.sftp://{$sftp}{$remote_dir}";
$handle = opendir($dir);
Когда $ remote_dir
- это полный путь от root, тогда open_dir
работает. Если $ remote_dir
- это просто «/» или «», то я получаю ошибку «невозможно открыть», как и вы.
В моем случае кажется, что ssh подключается к корневой папке, а не к 'домашний' каталог, как это делает ftp. Вы упомянули, что он работал на другом сервере, поэтому мне интересно, не проблема ли это просто конфигурации.
Недавно я попытался заставить SFTP работать на PHP и обнаружил, что использовать phpseclib намного проще:
http://phpseclib.sourceforge.net/
Если у вас есть роскошь не находиться на общем хосте и можно установить любые расширения, которые вы хотите, возможно, расширение PECL было бы лучше, но не всем из нас так повезло. Кроме того, API phpseclib выглядит более интуитивно понятным, поскольку он является ООП и всем остальным.
У меня была такая же проблема, но я мог решить проблему.
В моем случае при подключении к серверу я собирался в корень учетной записи, и из-за конфигураций сервера я не мог писать туда.
Я подключился к учетной записи, используя fireFTP, и поэтому я мог видеть, где находится корень учетной записи ... это был корень сервера.
Мне пришлось указать весь путь до папки, в которой мне разрешено писать, и я мог решить проблему.
Итак, мой совет - получить путь с помощью графического интерфейса (я использовал fireFTP) и добавить весь путь к вашему коду.
$pathFromAccountRootFolderToMyDestinationFolder = '/Account/Root/Folder/To/My/Folder';
$stream = fopen("ssh2.sftp://".$sftp."/".$pathFromAccountRootFolderToMyDestinationFolder."/myFile.ext", 'r');
Надеюсь, это поможет вам и другим людям с той же проблемой!
Ура!