PHP, Проверьте, существует ли URL-адрес и файл?

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

Первый файл определяется как путь к файловой системе, а второй – как URL.

Предположим, что первый файл:

/home/my_site/public_html/some_folder/required_file.php 

и второй файл:

 http://www.my_site.com/some_folder/required_url_file.php 

Обратите внимание, что оба файла не являются одним и тем же файлом в файловой системе. У файла required_file.php есть другой контент, чем required_url_file.php, и они действуют абсолютно по-разному

Любая идея о том, как проверить существование обоих файлов?

Вы можете проверить оба варианта:

 $file = '/home/my_site/public_html/some_folder/required_file.php'; $url = 'http://www.my_site.com/some_folder/required_url_file.php'; $fileExists = is_file($file); $urlExists = is_200($url); $bothExists = $fileExists && $urlExists; function is_200($url) { $options['http'] = array( 'method' => "HEAD", 'ignore_errors' => 1, 'max_redirects' => 0 ); $body = file_get_contents($url, NULL, stream_context_create($options)); sscanf($http_response_header[0], 'HTTP/%*d.%*d %d', $code); return $code === 200; } 

Основанный на примере кода Maor H., вот функция, которую я использую в своих плагинах:

 /** * Check if an item exists out there in the "ether". * * @param string $url - preferably a fully qualified URL * @return boolean - true if it is out there somewhere */ function webItemExists($url) { if (($url == '') || ($url == null)) { return false; } $response = wp_remote_head( $url, array( 'timeout' => 5 ) ); $accepted_status_codes = array( 200, 301, 302 ); if ( ! is_wp_error( $response ) && in_array( wp_remote_retrieve_response_code( $response ), $accepted_status_codes ) ) { return true; } return false; } 

Я сделал этот метод в классе-помощнике, однако, поместив его в файл functions.php вашей темы, вы должны сделать его общедоступным везде. Однако вы всегда должны писать в классах и создавать их. Это намного лучше для изоляции ваших функций плагина и темы.

При этом вы можете просто использовать:

if (webItemExists ('http://img.ruphp.com/wordpress/f)) {print' it iexists '; }

Чаще всего вы будете использовать вызовы WordPress для доступа ко всем элементам через относительный или полный URL. Если у вас есть относительная ссылка на что-то вроде /uploads/2012/12/myimage.png, вы можете преобразовать их в URL с полным URL-адресом и относительным URL-адресом WordPress, просто добавив get_site_url (). $ string при вызове функции webItemExists.

Что касается проверки URL-адреса, ни один из этих ответов не рассматривает правильный способ WordPress для выполнения этой задачи.

Для этой задачи следует использовать wp_remote_head() .

Вот статья, которую я написал о том, как проверить, существует ли внешний URL-адрес с HTTP API-интерфейсом WordPress . Проверьте это и выясните, как это работает.

 $file_exists = file_exists($path); $url_accessable = http_get($url, array("timeout"=>10), $info); // should not be FALSE $status_code = $info['response_code'] //should be 200 

Если у вас есть функция PECL http_head , вы можете проверить, возвращает ли он код состояния 200 для удаленного файла.

Чтобы проверить, можете ли вы получить доступ к локальному файлу, можете использовать file_exists , но это не означает, что вы сможете получить доступ к этому файлу. Чтобы проверить, можете ли вы прочитать этот файл, используйте is_readable .

Использовать функцию file_exists ()

 file_exists('http://www.my_site.com/some_folder/required_url_file.php'); 

вы получите результаты как True или false.

Чтобы проверить, существует ли файл, используйте метод file_exists .

Начиная с PHP 5.0.0, эта функция также может использоваться с некоторыми обертками URL. Обратитесь к поддерживаемым протоколам и упаковщикам, чтобы определить, какие обертки поддерживают семейство функций stat ().

 if(! (file_exists($url1) && file_exists($url2)) ) { die("Files don't exist - throw error here."); } // Continue as usual - files exist at this point. 

дистанционный пульт:

 $file = 'http://www.my_site.com/some_folder/required_url_file.php' if ( @fclose(@fopen($file,"r")) ) echo "File exists!"; 

местный:

 $file = '/home/my_site/public_html/some_folder/required_file.php'; if ( is_file($file) ) echo "File exists!"; 

Кажется, это работает для меня:

 function url_file_exists($url) { $context = stream_context_create(array('http' =>array('method'=>'HEAD'))); $fd = @fopen($url, 'rb', false, $context); if ($fd!==false) { fclose($fd); return true; } return false; } 

Проверка наличия файла:

 if (file_exists('path/to/file.txt')) { echo "File exists!"; } else { echo "File doesn't exist."; } 

Проверка правильности URL:

 $data = @file_get_contents("http://url.com/"); if (!$data) { echo "URL not valid."; } else { echo "URL is valid."; } 

Заметки:

В идеале вы не должны пытаться предсказать файловую систему. Хотя методы, такие как file_exists, очень полезны, на них не следует полагаться, и вместо этого вы должны пытаться писать в файлы, читать их и т. Д., А затем улавливать и обрабатывать любые исключения или ошибки, которые происходят.