Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   ззапись файла через fopen по протоколу ftp (https://javascript.ru/forum/server/8078-zzapis-fajjla-cherez-fopen-po-protokolu-ftp.html)

PeaceCoder 05.03.2010 20:14

ззапись файла через fopen по протоколу ftp
 
Вопрос следующий. Почему при открытии файла по протоколу ftp след образом и запись в него например 20кб, на диск сервера записывается от 1 до 5кб но никогда полная длина файла?
$ftppath = "ftp://{$conf['ftp']['user']}:{$conf['ftp']['pass']}@{$conf['ftp']['host']}{$conf['ftp']['base']}";
$ftp = fopen($ftppath."/export/$file",'wb');             
$r = fputs($ftp,$content,strlen($content));
//sleep(1); об этом ниже...
fclose($ftp);


Как видно я закомментил задержку. Так вот. Если завершить скрипт записи сразу же, то запись бажит (хоть и $r = длине $content), но если, например, после записи будет задержка (например генерация документа после экспорта данных), то запись производится корректно.

Не пойму это что, жесткий тормозит на сервере и ему время надо дать на окончание операции?

П.С. ftp_* не использовал, т.к. не на всех серверах открыт этот модуль...

B@rmaley.e><e 05.03.2010 20:37

А если записывать не сразу, а кусками по 1024 символов?

P.S. cURL?

PeaceCoder 05.03.2010 20:52

Цитата:

Сообщение от B@rmaley.e><e
А если записывать не сразу, а кусками по 1024 символов?

непробовал но это же будет намного дольше и не факт что также верно.
Цитата:

Сообщение от B@rmaley.e><e
P.S. cURL?

нет. простое сохранение данных на другой хост.

Gvozd 05.03.2010 22:26

PeaceCoder,
попробуй fflush
кстати, впервые вижу такую запись в FTP
обычно пишут через fsockopen(код получается объемнее, но можно много плюшек сделать), либо стандартные ftp_*** ф-ции(самый простой способ, подходящий для большинства ситуаций)
Хотя, и так думаю можно, но тут приходится надеятся на "URL wrappers".
честно говоря не доверяю им с тех пор, как попытался написать smb-сканер сетки. большинство попыток просто дохло раньше таймаута, который я даже в php.ini не нашел настроек.
Кстати, стоит проверить точно ли $ftppath."/export/$file" содержит именно то, что вы думаете
Моя рекомендация: используйте ftp_connect и связанное с ним семейство ф-ций
Цитата:

Сообщение от B@rmaley.e><e
cURL?

ну, какбы curl-функции имеют название, начинающееся с curl_ :)

PeaceCoder 06.03.2010 01:05

Цитата:

Сообщение от Gvozd
кстати, впервые вижу такую запись в FTP

http://ua2.php.net/manual/en/function.fopen.php
Цитата:

If PHP has decided that filename specifies a registered protocol, and that protocol is registered as a network URL, PHP will check to make sure that allow_url_fopen is enabled. If it is switched off, PHP will emit a warning and the fopen call will fail.
Цитата:

Сообщение от Gvozd
либо стандартные ftp_***

функции ftp_*** не имеют возможности создавать файл на лету. Ед. что я видел в возможностях это работа с готовыми файлами... создавать то как их?
Цитата:

Сообщение от Gvozd
fsockopen

да подумываю научится работать с сокетами, но ни как руки не дойдут...
Цитата:

Сообщение от Gvozd
$ftppath."/export/$file" содержит именно то, что вы думаете

точно содержат. я же написал, что файл создается там где нужно, но вот пишет в него разное количество данных, если не делать задержек...

Gvozd 06.03.2010 01:52

Цитата:

Сообщение от PeaceCoder
http://ua2.php.net/manual/en/function.fopen.php

ну, да
это то, что я сказал про URL-обертки
и они довольно глючны бывают, порой.
я на них не полагаюсь
PS а вы попробовали мой самый первый совет?
вы про него ничего не отписались, помог ли он вам, или же вы почему-то не можете им воспользоватся.
я думаю, это должно помочь

PeaceCoder 06.03.2010 13:39

Цитата:

Сообщение от Gvozd
S а вы попробовали мой самый первый совет?

fflush ? непомогает. всегда пишет 1кб заместь 20ти.
Пробовал по 1кб записывать результата никакого. только задержка помогает...
через fsocketopen так и не понял как записывать файл. там через заголовки надо както, мароки много.
через ftp_*** работа ток с готовыми файлами... да и не всегда ftp_*** есть на всех серверах, но что бы избавится от задержек, сделал так:
$fp = tmpfile();
fputs($fp,$content,strlen($content));
rewind($fp);
$ftp = ftp_connect($conf['ftp']['host']);
ftp_login($ftp,$conf['ftp']['user'],$conf['ftp']['pass']);
ftp_fput($ftp,$conf['ftp']['base']."/export/$file",$fp,FTP_BINARY);
ftp_close($ftp);
fclose($fp);


позже надо будет продумать универсальный класс работы с файлами как локальными так и удаленными...


Часовой пояс GMT +3, время: 18:08.