PHP, проверьте, существует ли URL и файл? - PullRequest
2 голосов
/ 31 октября 2011

Я создаю плагин для 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, и они действуют совершенно иначе

Есть идеи о том, как проверить наличие обоих файлов?

Ответы [ 10 ]

6 голосов
/ 31 октября 2011

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

$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;
}
5 голосов
/ 30 ноября 2012

На основе примера кода 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://myurl.com/thing.png')) {напечатать' он существует);}

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

4 голосов
/ 19 сентября 2012

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

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

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

2 голосов
/ 31 октября 2011
$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
1 голос
/ 25 декабря 2013

Мне кажется, это работает:

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;
}
1 голос
/ 22 сентября 2012

пульт:

$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!";
1 голос
/ 31 октября 2011

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

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

даст вам результаты как True или false.

1 голос
/ 31 октября 2011

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

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

1 голос
/ 31 октября 2011

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

Начиная с PHP 5.0.0, эту функцию также можно использовать с some Оболочки 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.
0 голосов
/ 31 октября 2011

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

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, очень полезны, на них не следует полагаться, и вместо этого вы должны пытаться записывать файлы, читать из них и т. Д., А затем перехватывать и обрабатывать любые возникающие исключения или ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...