#php
Вопрос:
В журнале ошибок я получил эту ошибку PHP Warning: extract() expects parameter 1 to be array
, это приведет к перегрузке сервера и увеличению загрузки процессора. что не так в моей функции php.
<?php
function rel2abs($rel, $base) {
if (empty($rel)) $rel = ".";
if (parse_url($rel, PHP_URL_SCHEME) != "" || strpos($rel, "//") === 0) return $rel;
if ($rel[0] == "#" || $rel[0] == "?") return $base.$rel;
extract(parse_url($base));
$path = isset($path) ? preg_replace('#/[^/]*$#', "", $path) : "/";
if ($rel[0] == '/') $path = "";
$port = isset($port) amp;amp; $port != 80 ? ":" . $port : "";
$auth = "";
if (isset($user)) {
$auth = $user;
if (isset($pass)) {
$auth .= ":" . $pass;
}
$auth .= "@";
}
$abs = "$auth$host$path$port/$rel"; //Dirty absolute URL
for ($n = 1; $n > 0; $abs = preg_replace(array("#(/.?/)#", "#/(?!..)[^/] /../#"), "/", $abs, -1, $n)) {}
return $scheme . "://" . $abs;
}
Комментарии:
1. Как видно из документации , для серьезно искаженных URL-
parse_url()
адресов может возвращаться значение false.2. можете ли вы исправить функцию выше.
Ответ №1:
Как упоминалось в комментарии выше parse_url()
, функция вернет false, если она не сможет проанализировать URL-адрес. И extract()
в качестве первого параметра требуется массив (не логическое значение).
Так что вместо:
extract(parse_url($base));
Тебе нужно что-то вроде этого:
$parsedUrl = parse_url($base);
if ($parsedUrl === false) {
throw new RuntimeException(sprintf('Unable to parse url [%s]', $base));
}
extract($parsedUrl);