Шляхом Альбірео

НовиниЗаписиPHPОтримання вмісту

2022.07.15
Отримання вмісту файла на віддаленому, або локальному сервері, та його збереження.

NoteВикористання бібліотеки curl для отримання контенту. Увага! Необхідно перевірити php.ini, щоби впевнитися, чи відкрито розширення curl (зазвичай, по замовчанню воно є).

/* Просте отримання вмісту файлу через curl */

[PHP]

<?php /** * @parma $url  URL віддаленого файлу * @Return $contents Отриманий контент     * **/ $ch = curl_init(); $timeout = 5; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $contents = curl_exec($ch); curl_close($ch); echo $contents; ?>

NoteПеревіряємо, чи є файл на віддаленому сервері, отримуємо вміст у пам'ть сервера з подальшим виводом в браузер, або його обробкою при необхідності.

/* Отримання вмісту віддаленого файлу */

[PHP]

<?php /** * @parma $url  URL віддаленого файлу * @Return $http_code Отриманий контент     * **/     public static function getContent($url){ $flag = 0; do { $hCurl = curl_init(); curl_setopt($hCurl, CURLOPT_HEADER, 0); curl_setopt($hCurl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($hCurl, CURLOPT_TIMEOUT, 120); curl_setopt($hCurl, CURLOPT_CONNECTTIMEOUT, 4); curl_setopt($hCurl, CURLOPT_URL, $url); $data = curl_exec($hCurl); if (curl_errno($hCurl)) { break; } $http_code = curl_getinfo($hCurl, CURLINFO_HTTP_CODE); if ($http_code >= 400) { //400 - 600 is server error break; } $flag = 1; } while (0); curl_close($hCurl); if ($flag) { return $data; } else { return false; } } ?>

NoteПеревіряємо, чи є файл на віддаленому сервері, отримуємо його вміст і записуємо в локальний файл для подальшого використання.

/* Отримання віддаленого файлу і збереження локально */

[PHP]

<?php /** * @Parma $filename Ім'я файлу для збереження * @parma $url  URL віддаленого файлу * @Return Отриманий контент * **/ public static function getContentToFile($fileName, $url) { $out = fopen($fileName, 'w'); if (empty($out)) { return false; } $flag = 0; do { $hCurl = curl_init(); curl_setopt($hCurl, CURLOPT_HEADER, 0); curl_setopt($hCurl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($hCurl, CURLOPT_TIMEOUT, 120); curl_setopt($hCurl, CURLOPT_CONNECTTIMEOUT, 4); curl_setopt($hCurl, CURLOPT_FILE, $out); curl_setopt($hCurl, CURLOPT_URL, $url); $data = curl_exec($hCurl); if (curl_errno($hCurl)) { break; } $http_code = curl_getinfo($hCurl, CURLINFO_HTTP_CODE); if ($http_code >= 400) { //400 - 600 is server error break; } $flag = 1; } while (0); curl_close($hCurl); fclose($out); if ($flag) { return $data; } else { return false; } } ?>

NoteЯкщо необхідно лише отримати вміст файла у строку, використовуємо file_get_contents(), бо швидкість його обробки набагато вища за fread().

/* Отримання вмісту файла в строку*/

[PHP]

<?php $homepage = file_get_contents('http://www.example.com/'); echo $homepage; ?>

NoteДля отримання додаткових параметрів файла потрібні fread(), та filesize().

/* Отримати розмір файла через filesize() і прочитати весь файл в строку */

[PHP]

<?php $filename = "/usr/local/something.txt"; $handle = fopen ($filename, "r"); // При чтанні двоічного файлу необхіно додати другий параметр "rb" $contents = fread($handle, filesize ($filename)); fclose($handle); ?>

NoteЯкщо файл для читання, це - віддалений файл, або файл потоку, то попередній приклад використовувати неможливо, оскільки filesize не може отримати розмір цих файлів. Тому, необхідно знайти кінець файлу по звротному значенню feof() або fread().

/* Отримати розмір файлу через filesize після feof() та fread() */

[PHP]

<?php $handle = fopen('http://www.baidu.com', 'r'); $content = ''; while(!feof($handle)){ $content .= fread($handle, 8080); } echo $content; fclose($handle); ?>

NoteВаріант отримання вмісту URL-адреси, але з перевіркою успіху дії (з використанням функції fgets()).

/* Вміст файлу з перевіркою успіху */

[PHP]

<?php $handel = @fopen("/tmp/inputfile.txt", "r"); if ($handel) { while ($buffer = fgets($handel, 4096) != false) { echo $buffer; } if (!feof($handel)) { echo "Error: unexpected fgets() fail\n"; } fclose($handle); } ?>

NoteПострокове читання контенту з файла. Після виклику функції fgets() вказівник зміщується на чергову строку.

/* Отримати вміст построково через fgets() */

[PHP]

<?php $file = fopen("welcome.txt", "r") or exit("Unable to open file!"); while(!feof($file)) { echo fgets($file). "<br>"; } fclose($file); ?>

NoteПострокове читання контенту з файла. Після виклику цієї функції fgetss() видалить будь-які теги HTML и PHP из прочитаного тексту. Можна скористатися необов'язковим третім параметром, щоб вказати, які теги не видаляються.

/* Отримати вміст построково через fgetss() */

[PHP]

<?php $handle = fopen('./file.txt', 'r'); while(!feof($handle)){ echo fgetss($handle, 1024, '<br>'); } fclose($handle); ?>

NoteЗаписати інформацію в data.txt в поточному каталозі. Якщо в поточному каталозі немає файла data.txt, то він буде створений.

/* Запис у текстовий файл */

[PHP]

<?php $file = "data.txt"; $content = "Зміст вмісту \r\n Перша строка \r\n Друга строка"; if(!$fp = fopen($file,'a')) { echo "Відкриваємо файл $file!"; exit; } if(fwrite($fp,$content) === FALSE) { echo "Запис файлу невдалий!"; exit; } echo "Запис файлу закінчено."; fclose($fp); ?>

NoteВідкриття URL за допомоги fsockopen(), яка вертає файловый вказівник false в разі невдачі при відкритті сокету інтернет-з'єднання.

/* Отримання файлу через функцію fsockopen() */

[PHP]

<?php $fp = fsockopen('http://www.baidu.com', 80, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br>\n"; } else { $out = "GET / HTTP/1.1\r\n"; $out .= "Host: www.example.com\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); } ?>