验证 PHP Laravel 中的 localhost:xxxx 链接


validate a localhost:xxxx link in php laravel

我有方法:

public function getAppLink($app_path)
{
    if( ! $this->isAppExists($app_path)) { return false; }
    $content = $this->getContent();
    // make sure that the link is available
    $validate_link = 'Validator::make(
        ['app_link' => $content->apps->$app_path->link],
        ['app_link' => 'active_url']
    );
    if($validate_link->fails())
    {
        $this->setAppStatus($app_path, 'stopped');
        $this->setAppLink($app_path, 'invalid_link');
        return '';
    }
    else {
        $this->setAppStatus($app_path, 'started');
        return $content->apps->$app_path->link;
    }
}

在返回链接之前,我需要验证localhost:xxxx链接是否处于活动状态并且可以通过浏览器访问。

不知何故,Laravel测试链接的方式不起作用,是我做错了,还是我需要使用不同的方法?

注意:XXXX 是端口号

Laravel active_url Validator只是PHP checkdnsrr函数的包装器。 此功能的目的只是检查 DNS 记录,而不是实际检查服务器是否正在响应。

因为您在localhost,所以没有DNS记录,所以此检查不起作用。

如果你想检查一个链接可以被浏览器访问,你必须在浏览器上的JavaScript中执行此操作。 否则,您可能会遇到这样一种情况:http://localhost:1234可以从服务器访问,但由于防火墙或 Web 服务器仅侦听127.0.0.1而不是所有 IP 地址而无法从浏览器访问。 虽然只要您在本地计算机上进行所有开发,这显然可以正常工作,但它可能会在生产中给您带来问题(当然,这取决于您需要此信息的确切目的)。

如果你真的想检查网站是否启动,只需对URL执行CURL GET(或HEAD)请求即可。

在Laravel中使用CURL的一种简单方法是使用此作曲家包。 完整的文档太长,无法放在这里,但你可以在这里找到它。

我通过使用fsockopen解决了这个问题:

// ==================================================== isLinkValid()
//
// $link : the link you want to validate, ex: localhost:1234
//
// return true | false
//
private function isLinkValid($link)
{
    if(strpos($link, ":") === false)
    {
        return false;
    }
    $arr_link = explode(":", $link);
    $host = $arr_link[0];
    $port = $arr_link[1];
    $sock_open = @fsockopen($host, $port);
    if(is_resource($sock_open))
    {
        fclose($sock_open);
        return true;
    }
    return false;
}