Коли потрібно використовувати клас FTP?
Цей вид класу можна застосовувати в кількох випадках. Парою сценаріїв можуть бути:
Автоматизація вивантаження зображень, таких як галерея, на вебсайт клієнта (в ідеалі - в поєднанні з моєї підказкою зі зміни розміру зображення);
Робіть бекапи поза сайтом, передаючи файл бекапа бази даних зі свого сервера на інший. (Примітка: не рекомендується для секретної інформації, тому що FTP - не дуже захищений протокол).
Примітка: можна легко наштовхнутися на труднощі при роботі з FTP, так як у різних серверів різні конфігурації. Даний код був успішно протестований на багатьох серверах FTP.
Що таке FTP?
FTP: "Стандартний мережевий протокол, який використовується для копіювання файлу з одного хоста на інший."
FTP, або File Transfer Protocol - це, за визначенням Wikipedia: "Стандартний мережевий протокол, який використовується для копіювання файлу з одного хоста на інший через засновану на TCP / IP мережу, таку, як Інтернет."
Насправді, він дозволяє копіювати файл (и) з одного комп'ютера на інший.
Крок 1 - Підготовка
Почнемо по можливості з самого легкого. У корені свого нового проекту створіть два файли: index.php і ftp_class.php.
Файл, який створює об'єкт і викликає необхідні методи - index.php - це наша головна сторінка. ftp_class.php - це наш клас ftp.
В наступному кроці ми створимо «скелет» класу. Коли він буде готовий, ви зможете піти далі і спробувати виконати кожен етап.
Крок 2 - Встановлюємо клас
Сильною стороною об'єктно-орієнтованого програмування (Object-Oriented Programming (OOP)) є те, що воно дає складного коду легкий у використанні інтерфейс. Створюючи клас - вважайте клас шаблоном - ви можете инкапсулировать (герметизувати) дані, що є простим жаргонним словом для терміна, що відноситься до приховування даних. Потім можна знову використовувати цей клас знову і знову без потреби в переписуванні частин коду. Замість того вам потрібно всього лише викликати відповідні методи (термін "method" - це те ж саме, що function).
Давайте почнемо створювати свій клас ftp. Відкрийте файл ftp_class.php і додайте наступний код. Це основна структура скелета класу, яку я назвав 'FTPClient'.
Функція construct, відома як конструктор, це спеціальний метод класу, автоматично їм викликається, коли ви створюєте новий об'єкт, або приклад класу. Зазвичай це відмінне місце, що підходить для додавання ініціалізації; але для сьогоднішньої мети вона нам не потрібна. Проте, ми покладемо її тут для використання на майбутнє.
Будь ласка, зверніть увагу, що для методу construct ми використовуємо подвійне підкреслення.
Крок 3 - Змінні класу
Далі ми встановимо кілька змінних класу або властивостей.
Префікс "private" визначає область дії змінної. В даному випадку це означає, що доступу до змінної ззовні класу немає нізвідки.
Змінна $ connectionId буде містити наш потік з'єднання. Дві інших містять статус і повідомлення. $ LoginOk буде корисна для визначення того, чи правильно ми з'єднані.
Крок 4 - Запис простого повідомлення
Майже в кожному методі ми будемо викликати метод з назвою 'logMessage. Це - найголовніший обробник повідомлення, який дасть нам можливість збирати будь-які повідомлення, створені нашим класом так, щоб було можна гарантувати користувачеві відповідну реакцію.
Зверніть увагу, що ми не робимо return (повернення) цих повідомлень зі своїх методів. Замість того ми повертаємо true або false, засновані на тому, чи була успішною окрема операція. У цього є свої переваги, але, крім того, воно не деталізує користувачеві те, що відбувається.
Додайте два наступних методу, щоб було можна визначити, що пройшло успішно.
Цей метод приймає змінну $ message. Вміст змінної потім зберігається в масиві класу завдяки рядку: $ this-> messageArray [] = $ message;
Так як $ messageArray - змінна класу, ми можемо отримати до неї доступ через запис $ this->.
Будучи всередині класу, $ this відноситься до самого об'єкта.
Щоб повернути це повідомлення, ми викликаємо getMessages.
Цей метод - відкритий. Як уже згадувалося, ці закриті / відкриті справи просто відносяться до області дії змінної або, в даному випадку, методу. До закритого методу (або змінної) не можна отримати доступ зовні класу, в той час, як до відкритого методу (або змінної) можна.
Так як наша змінна закрита, нам потрібен спосіб отримання до неї доступу. Ми робимо це, призначаючи своїм класом метод public, до якого ми маємо потім доступ зовні класу. Вам, може бути, цікаво, чому ми не можемо просто зробити messageArray відкритої змінної. можемо; просто це не дуже добре.
Примітка: в мережі повно прикладів оброблювачів повідомлення в повному кольорі, або класів, присвячених їм. Ми ж працюємо над простий реалізацією мети цього підручника.
Крок 5 - З'єднання
На цьому етапі ми додамо метод connect. Він дозволить нам з'єднуватися з сервером FTP.
Ми віддаємо інформацію: сервер ($ server), ім'я користувача ($ ftpUser) і пароль ($ ftpPassword) для установки з'єднання.
Перший рядок коду відкриває з'єднання FTP з окремим сервером за допомогою ftp_connect. Ми зберігаємо своє з'єднання в змінну класу, $ connectionId, описану вище.
Код ftp_login записує нас в окреме з'єднання, передаючи наш connection id, ім'я користувача і пароль.
Визначаємо, чи було з'єднання успішним. Потім записуємо результати, викликаючи метод обробника простого повідомлення logMessage () і передаємо в лог рядок. Пам'ятайте: для отримання доступу в logMessage () ми користуємося $ this->, так як це змінна класу.
Фреймворк YII2. Швидка розробка з сучасним PHP фреймворком
Дізнайся тонкощі сучасної веб-розробки за допомогою фреймворка YII2
Крок 6 - Викликаємо об'єкт
Тепер, коли наш клас працює, ми можемо його протестувати! Відкрийте файл index.php і додайте наступний код.
Вам знадобиться доступ на сервер FTP. Якщо хочете встановити свій власний сервер, спробуйте Filezilla - він безкоштовний.
Ви помітите, що я додав тут подробиці сервера FTP. В ідеалі вони будуть зберігатися в файлі config. Змініть їх на установки свого FTP.
Після визначення подробиць сервера ми включаємо клас з include ( 'ftp_class.php') ;. Це означає: зробити клас доступним зсередини цієї сторінки. Наступний рядок створює об'єкт класу FTP і зберігає його у змінній $ ftpObj. $ FtpObj тепер буде використовуватися для доступу до будь-яких відкритим методам всередині нашого класу. Це робиться з використанням запису ->, в точності як це робить наступний рядок, викликаючи метод $ ftpObj -> connect і передаючи йому деталі нашого сервера.
Коли клас вже на місці, легко помітити, що з'єднання з сервером FTP - дійсно легке завдання!
В останньому кроці ми могли б обернути виклик з'єднання в if-пропозиція, як показано нижче. Потім, якщо з'єднання не вдасться встановити, залежний код не буде виконуватися. Далі ми можемо послати користувачеві кілька повідомлень, таких як «з'єднання встановлено» ( "connected") або «встановити з'єднання не вдалося» ( "failed").
Виходить нормально, хоча наш код досить швидко розпухне від пропозицій IF / ELSE, якщо ми додамо це до всіх своїх викликам. Замість того я запропонував би альтернативу, яка полегшить продовження роботи і зробить код чистіше.
Пам'ятайте додані нами методи обробника повідомлення? Якщо хочете бачити повідомлення, вироблені класом - корисні для налагодження і відповідної реакції - можете додати наступний код після будь-якого викликається методу.
Він відобразить повідомлення класу.
Крок 7 - Робимо свою першу директорію
Прекрасно, нам пора зробити що-небудь корисне. Перший метод, який ми створимо, це makeDirmethod. Як і очікується, він створить для нас на сервері директорії. Єдиний параметр, який ми передамо - це шлях до теки й назва папки; назвемо її $ directory. Магічною рядком тут є функція ftp_mkdirbuilt-in. Для створення папки вона використовує наш збережений "connectionId" і передану змінну $ directory.
Додайте в файл ftp_class.php наступний код:
Змінна $ dir встановлена до назви папки, яку нам потрібно створити на сервері. В даному випадку «фото» ( "photos"). Наступний рядок викликає метод, який створить папку.
Якщо ви отримуєте повідомлення про помилку «право доступу відсутній» ( "Permission denied"), переконайтеся, що можете писати в зазначеній папці. Вам, можливо, доведеться створити папку всередині директорії, таку як / httpdocs.
Крок 8 - Вивантаження файлу
В продовження роботи давайте вивантажимо фотографію з назвою zoe.jpg. При вивантаженні файлу нам потрібно визначити, з яким типом файлу ми працюємо - binary або ascii? В основному при вивантаженні текстового файлу слід користуватися ascii; в іншому випадку він повинен бути встановлений на binary.
Ми починаємо з встановлення масиву з усіма розширеннями, які будуть використовуватися для вивантаження типу ascii.
Потім поверніть розширення нашого файлу, щоб можна було протестувати, чи не належить він до типам ascii. Ми визначаємо це, отримавши розширення вивантажується файлу. Простий і швидкий метод, використаний мною тут - «витяг» файлу за допомогою '.' Як роздільник. Так файл розбивається на фрагменти і зберігається як array. Використовуючи іншу вбудовану функцію PHP, "end", ми вибираємо останній елемент array, що містить наше розширення. Це дуже акуратний маленький фрагмент коду.
Далі ми тестуємо, з'являється чи наше розширення в списку (з in_array) файлових розширень, які слід вивантажувати як тип ascii. Якщо воно з'являється в списку, встановлюємо змінну $ mode на FTP_ASCII; інакше робимо висновок, що це тип binary і призначаємо $ mode значення FTP_BINARY.
ftp_put вивантажує файл з вашого місця розташування в віддалений файл на сервері ftp. Ми передаємо йому свій "connectionId", шлях до файлу, який нам потрібно вивантажити ($ fileTo), шлях до файлу, який потрібно вивантажити ($ fileFrom) і режим ($ mode), який ми тільки що визначили.
Далі додаємо в файл ftp_class.php наступний метод:
Звичайно, ви можете створити або вивантажити будь-яку назву папки на свій розсуд! Додайте в файл index.php наступний фрагмент коду та відповідно його зміните.
На даний момент ви повинні звикнути до того, наскільки легко використовувати цей клас! Ми всього лише робимо окремі виклики для виконання своїх завдань - і все завдяки об'єктно-орієнтованого програмування!
Давайте тепер підтвердимо, що наш файл знаходиться в папці з фотографіями. Це можна зробити, пройшовши в папку 'photo' на сервері, а потім показавши її вміст.
Метод changeDir застосовує "ftp_chdir" для зміни поточної директорії на сервері ftp. Для зміни директорії просто передайте її. Легко і просто.
getDirListing покаже вміст директорії, в якій ви перебуваєте, за допомогою функції "ftp_nlist". Вона повертає список файлів в даній директорії. Поточна директорія встановлена за замовчуванням, так що вам не потрібно забезпечувати ніяких параметрів.
Метод getDirListing повертає масив, що містить listing нашої директорії.
Ваш результат повинен виглядати приблизно так:
Крок 10 - Закачуємо файл
У міру наближення до кінця підручника ми переходимо до закачування файлу. Метод починається з того ж коду, що і uploadFile, де визначає, чи є файл, який нам потрібно закачати, ascii або binary.
Для цього методу ви просто передаєте назва файлу (і, можливо, шлях в залежності від того, чи перебуваєте ви в тій же папці, що і файл, який слід завантажити), який потрібно закачати і назви, яке вам хотілося б привласнити цього файлу на своєї клієнтської машині.
Для закачування файлу потрібно викликати ftp_get.
Так скачується файл з віддаленого сервера на нашу локальну машину. Він приймає наступний параметр: id нашого з'єднання, шлях або назва файлу для його локального збереження (буде переписано, якщо таке вже існує) ($ fileTo), розташування і назва файлу на віддаленому сервері ($ fileFrom) і режим ($ mode).
Ми збираємося завантажити той же файл, який вивантажили, зберігши його під іншою назвою на своїй клієнтській машині.
Примітка: знову переконайтеся, що права доступу правильно встановлені!
Так як зараз ми повинні перебувати всередині папки з фотографіями, то не додаємо шлях до змінної $ fileFrom - тільки назва файлу.
Крок 11 - Закінчуємо
Щоб закінчити повністю зі своїм класом, давайте додамо метод class magic method, __deconstruct. Цей метод закриває наше з'єднання, коли посилання на об'єкт вже не існує - можливо, сторінка була закрита. У будь-якому випадку, цей код запустився і з'єднання закрито. Це правильно - включати його, хоча він не є обов'язковим.
висновок
Ну, що ж, ось і все! Сподіваюся, ви тепер краще розумієте, як використовувати FTP за допомогою PHP. У вас зараз вже повинні бути необхідні навички подальшого розширення цього класу для підтримки інших простих завдань, таких як перейменування або видалення файлів і папок.
Не соромтеся дати нам знати, якщо створите якісь класні клієнти PHP FTP!
Редакція: Ріг Віктор і Андрій Бернацький. Команда webformyself.
Фреймворк YII2. Швидка розробка з сучасним PHP фреймворком
Дізнайся тонкощі сучасної веб-розробки за допомогою фреймворка YII2
Найсвіжіші новини IT і веб-розробки на нашому Telegram-каналі