Проверять действительные / активные URL перед загрузкой - Laravel 7 - PullRequest
1 голос
/ 13 апреля 2020

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

Я хочу начать загрузку, только если ссылка активна 200 ОК.

Попробуйте # 1

public function handle()
{
    $skills = Skill::all();

    if($skills != null){

        foreach($skills as $i=>$skill){

            if (strpos($skill->img_path, 'http') !== false) {
                if(!isset($exception)) {

                    //update the path in DB
                    $image_path      = '/assets/fe/img/skill/';
                    $img_name        = $skill->name.'.png';
                    $path            = public_path() . $image_path . $img_name;
                    $uploadSuccess   = file_put_contents($path, file_get_contents($skill->img_path));

                    // dd($uploadSuccess);

                    if($uploadSuccess) {
                        $skill->img_path = $image_path . $img_name;
                    }

                }

            }

            $skill->save();

        }

    }
}

Кажется, у меня столько проблем

Одна из них

curl: ( 6) Не удалось разрешить хост: thumbsplus.tutsplus.com

Еще один

file_get_contents (https://assets-cdn.github.com/images/modules/logos_page/Octocat.png): не удалось открыть поток : HTTP-запрос не выполнен! HTTP / 1.1 404 не найден

Что такое чище? Пожалуйста, предложите, я попробую сейчас.


Попробуйте # 2

public function handle()
{
    $skills = Skill::all();

    if($skills != null){

        foreach($skills as $i=>$skill){

            if (strpos($skill->img_path, 'http') !== false) {

                $file_headers = @get_headers($skill->img_path);
                if(!$file_headers || $file_headers[0] == 'HTTP/1.1 404 Not Found') {
                    $exists = false;
                }
                else {
                    $exists = true;

                    if(!isset($exception)) {

                    //update the path in DB
                        $image_path      = '/assets/fe/img/skill/';
                        $img_name        = $skill->name.'.png';
                        $path            = public_path() . $image_path . $img_name;
                        $uploadSuccess   = file_put_contents($path, file_get_contents($skill->img_path));

                    // dd($uploadSuccess);

                        if($uploadSuccess) {
                            $skill->img_path = $image_path . $img_name;
                        }

                    }
                }

            }

            $skill->save();

        }

    }
}

Попробуйте # 3

public function handle()

{
    $skills = Skill::all();


    $failCount = 0;
    $successCount = 0;


    $failList = [];

    if($skills != null){

        foreach($skills as $i=>$skill){

            if (strpos($skill->img_path, 'http') !== false) {


                $file_headers = @get_headers($skill->img_path);
                if(!$file_headers || strpos($file_headers[0], '404') !== false) {
                    $exists = false;
                    $failCount++;

                    array_push($failList,$skill->name);
                    // break;
                }
                else {


                    $exists = true;
                    $successCount++;


                    //DEBUG
                    // dd($file_headers[0]);


                    if(strpos($file_headers[0], '200')) {

                        //update the path in DB
                        $image_path      = '/assets/fe/img/skill/';
                        $img_name        = $skill->name.'.png';
                        $path            = public_path() . $image_path . $img_name;
                        $uploadSuccess   = file_put_contents($path, file_get_contents($skill->img_path));


                    // dd($uploadSuccess);

                        if($uploadSuccess) {
                            $skill->img_path = $image_path . $img_name;
                        }

                    }


                }

            }

            $skill->save();
            echo ".";
        }

    }


    echo "\r\n";

    $this->info('=========================');
    $this->info('Success :'. $successCount);
    $this->info('=========================');
    $this->info('Fail    :'. $failCount);
    $this->info('List    :'. print_r($failList));
    $this->info('=========================');

}

, кажется, работает

но зависает, иногда более 1 минуты, в определенное время dot

⚡️  php artisan skillIcons:download                                                                           
..............................................................................................................................                                                                                                                  
=========================                                                                                               
Success :12                                                                                                             
=========================                                                                                               
Fail    :7                                                                                                              
Array                                                                                                                   
(                                                                                                                       
    [0] => GitHub                                                                                                       
    [1] => Geolocation API                                                                                              
    [2] => Xcode                                                                                                        
    [3] => Protractor                                                                                                   
    [4] => Sketch                                                                                                       
    [5] => Amazon ECR                                                                                                   
    [6] => WinSCP                                                                                                       
)
List    :1
=========================

Кажется, что все изображения успешно загружены

⚡️   ls public/assets/fe/img/skill/
AWS Console.png         Digital Ocean.png       Javascript.png          PayPal.png              Terminal.png
AWS.png                 Disqus.png              Jest.png                Photoshop.png           TextMate.png
Alimofire.png           Divvy.png               Jira.png                Pod.png                 TextWrangler.png
Amazon ECS.png          Docker.png              Kamar.png               PostgreSQL.png          Transmit.png
Amazon RDS.png          Duet.png                LESS.png                PyCharm.png             Twitter.png
Angular.png             EC2.png                 Laravel Elixir.png      Python.png              Ubuntu.png
AngularJS.png           Evernote .png           Laravel.png             QuickBooks.png          VMWare Fusion .png
Apache.png              Express.png             Linode.png              React Native.png        VS Code.png
Atom.png                Facebook.png            Mac OS X.png            Realm.png               Vagrant.png
Bash.png                Final Cut.png           Markdown.png            Redis.png               Virtual Machine.png
BitBucket.png           FusionCharts.png        MobaXTerm.png           RequireJS.png           Virtualbox.png
Bower.png               GitLab.png              Mocha.png               S3.png                  Webpack.png
CKEditor.png            Go Daddy.png            MySQL.png               SAML 2.0.png            Windows.png
CSS.png                 Google Chart.png        NPM.png                 Salesforce.png          Wireshark.png
Camtasia.png            Google Map.png          Navicat Premium.png     Sass.png                Word.png
Cent OS.png             Google Translation.png  Nginx.png               Secure Shell.png        Yarn.png
Chai.png                Gulp.png                Node.png                Selenium.png            iMovie.png
Chat.io.png             HTML.png                Noteability.png         Shopify.png             iOS.png
Coda.png                Heroku.png              OAuth 2.0.png           SinonJS.png             jQuery.png
CodeBox.png             Illustrator.png         Open  Stack.png         Siteground.png
Composer .png           Instagram.png           OpenID Connect.png      Sublime Text.png
Confluence .png         J Player.png            PHP.png                 Swagger.png

3 секунды

Как уменьшить время ожидания до 3 секунд?

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Вы должны каким-то образом обработать ошибку. Вы можете попробовать

try {
    ...
} catch () {
    ...
}

Но я предпочитаю все делать таким образом

public function handle()
{
    Skill::get()->map(function($skill){
        if(strpos($skill->img_path, 'http')) return;
        $img = $this->getImageFromUrl($skill->img_path)
        if(!$img == null) return;

        $image_path      = '/assets/fe/img/skill/';
        $img_name        = $skill->name.'.png';
        $path            = public_path() . $image_path . $img_name;
        $fp = fopen($path,'x');
        fwrite($fp, $img);
        fclose($fp);

        if($uploadSuccess) {
            $skill->img_path = $image_path . $img_name;
            $skill->save();
        }
    });
}

public function getImageFromUrl($url){
    $ch = curl_init ($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); // The number of seconds to wait while trying to connect. Use 0 to wait indefinitely.
    curl_setopt($ch, CURLOPT_TIMEOUT, 2); // The maximum number of seconds to allow cURL functions to execute

    $img = curl_exec($ch);
    $err = curl_error($ch);

    if($err) {
        echo $err;
        return null;
    }

    curl_close($ch);

    return $img;
}

Я реорганизовал некоторый код, и если вы предпочитаете это, сохраните его, если не получите только logi c и сделайте это как вы предпочитаете

Надеюсь, это поможет

1 голос
/ 14 апреля 2020

Вы можете использовать active_url правило проверки, чтобы проверить, жив ли данный URL. Согласно документам:

В проверяемом поле должна быть действительная запись A или AAAA в соответствии с функцией dns_get_record PHP. Имя хоста из указанного URL извлекается с помощью функции parse_url PHP, а затем передается в dns_get_record.

if (validator([$skill->img_path], ['active_url'])->fails()) {
    // URL is not valid/active
}
else {
    // URL is valid/active   
}
...