Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Сеть > синхронизация содержимого папок


Автор: Acer 23.1.2008, 02:59
Есть локальная сеть (Windows).
На одном из компов локальной сети стоит Apache. На нем есть директория, называемая Secondary
На другом компе находится директория, которая называется Prime.
Необходимо, чтобы файлы в директории Secondary были такие же, как в директории Prime(вычесляется CRC32 код).
Алгоритм я уже написал.
Одна проблема возникает. Как скопировать файлы по локальной сети с помощью PHP. Либо как это сделать через cmd...
 smile 
Подскажите пожалуйста.

Автор: Sardar 23.1.2008, 04:31
Качественно и на долго: http://en.wikipedia.org/wiki/Rsync  (только для винды тяжёлый Cygwin просит)
fopen понимает \\server\share пути, т.е. расшарь директорию (виндовая сеть задумчива, может тормозить).
Можно FTP поднять на Secondary и сливать файлы.
Можно на прямую друг к другу сокеты открывать и файлы передавать (firewall локальный должен позволить)

Автор: Acer 23.1.2008, 10:45
Sardar, можешь подсказать, как с помощью сокетов такое делать? То, есть кусочичек кода... Я читал про них, но ниче не понял smile

Автор: GeneralElectric 23.1.2008, 11:33
Acer, ты уверен, что это надо делать "с помощью соектов"?  Ты, собственно, имеешь представление о том, что такое сокет?

Автор: MoLeX 23.1.2008, 11:48
ИМХО: на второй компьютер поставил бы ftp-сервер и в дальнейшем через фтп передавал файлы. 

Автор: Sardar 23.1.2008, 12:47
Цитата(Acer @  23.1.2008,  09:45 Найти цитируемый пост)
можешь подсказать, как с помощью сокетов такое делать?

В первом же http://nl2.php.net/manual/en/function.socket-create-listen.php пример. Идея проста:
  • создаём сокет типа AF_INET
  • биндим на локальный адрес/порт
  • ставим размер очереди коннектов (socket_listen)
  • socket_accept блокирует, пока кто нибудь не подключится
  • читаем стрим из сокета (к примеру TAR/GZ архив), что нибудь делаем
Удобная socket_create_listen выполняет первые три шага за тебя.

Автор: Acer 23.1.2008, 12:57
Цитата(GeneralElectric @ 23.1.2008,  11:33)
Acer, ты уверен, что это надо делать "с помощью соектов"?  Ты, собственно, имеешь представление о том, что такое сокет?

Не уверен, что это надо делать с помощью сокетов. И имею очень маленькое представление о них

Добавлено через 5 минут и 43 секунды
Цитата(Sardar @ 23.1.2008,  12:47)
Цитата(Acer @  23.1.2008,  09:45 Найти цитируемый пост)
можешь подсказать, как с помощью сокетов такое делать?

В первом же http://nl2.php.net/manual/en/function.socket-create-listen.php пример. Идея проста:

  • создаём сокет типа AF_INET
  • биндим на локальный адрес/порт
  • ставим размер очереди коннектов (socket_listen)
  • socket_accept блокирует, пока кто нибудь не подключится
  • читаем стрим из сокета (к примеру TAR/GZ архив), что нибудь делаем
Удобная socket_create_listen выполняет первые три шага за тебя.

Спасибо. Щас попробую смастерить что-то. Просто первый раз имею дело с такими вещами

Автор: GeneralElectric 23.1.2008, 13:08
Sardar, мне кажется, что вы друг друга немного не поняли =)

Acer, по локальной сети файлы копируются в PHP точно так же, как и в файловой системе. Указываешь имена файлов - и в путь. Как минимум, тебе надо хотя бы попробовать это сделать.
А с помощью сокетов что-то сделать можно только в том случае, если у тебя есть этот сокет. Т.е. порт, в котором сидит кто-то, кто понимает команды, которые ты собираешься ему отдать. На втором компе ничего такого, как я понимаю, нету.

Автор: Sardar 23.1.2008, 13:20
2GeneralElectric, вариант с сокетами был самый последний, как наименее гибкий (но быстрый в реализации smile ).

Цитата(GeneralElectric @  23.1.2008,  12:08 Найти цитируемый пост)
Т.е. порт, в котором сидит кто-то, кто понимает команды

В данном случае пишется и клиент, и сервер. В предыдущем посте подсказал как создать именно серверную сторону. Клиент думаю всем предельно ясен (fsockopen, fread/fwrite).

Автор: MoLeX 23.1.2008, 13:34
Цитата(Sardar @  23.1.2008,  13:20 Найти цитируемый пост)
В данном случае пишется и клиент, и сервер. 

лишнии действия, не стоит заново изобретать велосипед если он уже есть. 

Вопрос к Acer'у: это единоразовая операция по копированию или она должна выполняться при появлении новых файлов в указанной папке?

Автор: Acer 23.1.2008, 18:53
Цитата(MoLeX @ 23.1.2008,  13:34)
Вопрос к Acer'у: это единоразовая операция по копированию или она должна выполняться при появлении новых файлов в указанной папке?

При нажатии кнопки файлы начинают проверяться... Ну, с одной стороны единоразовая с другой нет smile

Автор: Acer 25.1.2008, 17:19
Народ, ниче не получилось. :(
Может что-то надо включить в httpd.conf?
Я пробовал стандартными функциями пхп. fopen(), readdir(), copy() с указанием сетевых путей к расшаренным директориям....

Автор: GeneralElectric 25.1.2008, 18:36
что ты делал функцией fopen()? какая из этих трех функций не работает?
И - самое главное - что значит "ниче не получилось"? не получилось написать эти функции без ошибок? Не получилось запустить PHP скрипт? Или браузер?
Что именно не получилось? Как можно помочь человеку, у которого вся проблема укладывается в три слова: "я пробовал функцию readdir"?
Как именно пробовал? Что хотел получить? что получил в итоге? Какие сообщения об ошибках выдавались?

Добавлено через 2 минуты и 23 секунды
Цитата(Acer @  25.1.2008,  17:19 Найти цитируемый пост)
Может что-то надо включить в httpd.conf

может и надо. Но не тыкать же наугад! Если включать - то осмысленно, наверное? Проанализировав ошибки, и установив причину.

такой настройки "чтобы работала функция readdir" в httpd.conf нету.

Автор: Acer 25.1.2008, 19:37
fopen( '//10.55.1.129/Shared/text.txt', 'r' );

Warning: fopen(//10.55.1.129/Shared/text.txt) [function.fopen]: failed to open stream: Permission denied in D:\WWW\htdocs\pal\test.php on line 3

opendir( '//10.55.1.129/Shared' );
Warning: opendir(//10.55.1.129/Shared) [function.opendir]: failed to open dir: Permission denied in D:\WWW\htdocs\pal\test.php on line 7


Права есть. На чтение тем более.

Автор: GeneralElectric 25.1.2008, 19:42
Файрволл?

Автор: Acer 25.1.2008, 20:23
Стоит NOD. Не знаю, работает он как файерволл или нет...

Автор: GeneralElectric 25.1.2008, 20:25
В виндоусе, обычно, есть файрволл.
Плюс утверждение "права есть" требует серьёзной проверки.

Автор: Acer 25.1.2008, 20:44
Перед тем, как писать про права доступа, я их проверил. Там было все разрешено.
Но вендовский файрволл был включен... Выключил его. Теперь:
Код

Warning: opendir(//10.55.1.129/Shared) [function.opendir]: failed to open dir: No error in D:\WWW\htdocs\pal\test.php on line 7

Автор: GeneralElectric 25.1.2008, 21:20
А с таким наклоном косой черты точно работает ? как директори сепаратор оно катит, но как идентификатор смб ресурса?

Автор: Acer 25.1.2008, 21:49
GeneralElectric, не знаю, что такое смб ресурс, но с обратным(виндовским) наклоном все тоже самое... То же предупреждение

Автор: Acer 28.1.2008, 12:54
Люди, всем спасибо за содействие. Я уже во всем разобрался.
Видел еще одну темку, связанную с локальной сетью. Так вот.

Для того, чтобы был доступ к сетевым ресурсам, нужно, чтобы Apache был запущен от имени того пользователя, у кого есть доступ к необходимому ресурсу в локальной сети. У меня работает...
например:
Код

readdir("//comp/dir/dir")

---------------------------
Apache 2.2.6
PHP 5.2.5

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)