thiva7 Δημοσ. 20 Μαρτίου 2015 Δημοσ. 20 Μαρτίου 2015 Καλησπερα εχω αυτο το κωδικα <?php $url = "http://www.domain.com/media/videos/tmb/000/000/345/1.jpg"; function check_url($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); $headers = curl_getinfo($ch); curl_close($ch); return $headers['http_code']; } $check_url_status = check_url($url); if ($check_url_status == '200') echo "Link Works"; else echo "Broken Link"; για να δω αν καποιο αρχειο λείπει... οταν ομως αλλαζω το $url = "http://www.domain.com/media/videos/tmb/000/000/345/1.jpg"; σε $url = "http://www.domain.com/media/videos/mp4/000/000/345/1.mp4"; απλα κανει loading για παντα και δεν μου διχνει κατι....πως μπορω να το φτιάξω αυτό? Ευχαριστω
nucleus Δημοσ. 20 Μαρτίου 2015 Δημοσ. 20 Μαρτίου 2015 Αν βάλεις το mp4 url σε κάποιο browser παίζει κανονικά? Δες το response από τον web server με τα developer tools του browser σου. https://www.codementor.io/tips/8417972938/how-to-check-if-a-remote-file-exists-in-php-using-curl Αυτό παίζει? 1
Noobie Δημοσ. 20 Μαρτίου 2015 Δημοσ. 20 Μαρτίου 2015 Αυτό που γίνεται είναι ότι το script κατεβάζει το mp4 και για αυτόν τον λόγο αργεί, αυτό που πρέπει να κάνεις είναι να προσθέσεις την γραμμή παρακάτω για να παίρνει μόνο τα headers και να αγνοεί το body. curl_setopt($ch, CURLOPT_NOBODY, true); Αν βάλεις το mp4 url σε κάποιο browser παίζει κανονικά? Δες το response από τον web server με τα developer tools του browser σου. https://www.codementor.io/tips/8417972938/how-to-check-if-a-remote-file-exists-in-php-using-curl Αυτό παίζει? Να ξέρεις ότι το request δεν θα εμφανιστεί στα developer tools του browser σου εφόσον το request γίνεται από το λογισμικό web server (π.χ Apache) και όχι από τον browser. 1
thiva7 Δημοσ. 20 Μαρτίου 2015 Μέλος Δημοσ. 20 Μαρτίου 2015 Αν βάλεις το mp4 url σε κάποιο browser παίζει κανονικά? Δες το response από τον web server με τα developer tools του browser σου. https://www.codementor.io/tips/8417972938/how-to-check-if-a-remote-file-exists-in-php-using-curl Αυτό παίζει? Ναι κανω δοκιμες με σιγουρα αρχεια για να δω αποτελεσματα και την λειτουργια του κωδικα. Αυτό που γίνεται είναι ότι το script κατεβάζει το mp4 και για αυτόν τον λόγο αργεί, αυτό που πρέπει να κάνεις είναι να προσθέσεις την γραμμή παρακάτω για να παίρνει μόνο τα headers και να αγνοεί το body. curl_setopt($ch, CURLOPT_NOBODY, true); Να ξέρεις ότι το request δεν θα εμφανιστεί στα developer tools του browser σου εφόσον το request γίνεται από το λογισμικό web server (π.χ Apache) και όχι από τον browser. Ευχαριστω Δουλεύει μια χαρά .....κάνω διάφορες δοκιμές και βλέπω να τρέχει ρολόι 1
thiva7 Δημοσ. 20 Μαρτίου 2015 Μέλος Δημοσ. 20 Μαρτίου 2015 Μια ακομα ερωτηση, πως μπορω να κανω ",μαζικα" τσεκ? βάζοντας ενα ενα ολα οκ, απλα θελ να κοιταω μερικες χιλιαδες μαζι Αυτος ο κωδικας μαλλον ειναι λαθος που δοκιμασα ε? foreach ($videos as $video) { function check_url($url) { $url = $video; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_NOBODY, true); $data = curl_exec($ch); $headers = curl_getinfo($ch); curl_close($ch); return $headers['http_code']; } $check_url_status = check_url($url); if ($check_url_status == '200') echo "Link Works ".$url.""; else echo "Broken Link ".$url.""; } μάλλον αυτος ο κδικας που έφτιαξα βλέπει ολα τα λινκ μαζεμένα ετσι το $url = ΟΛΑ τα λινκ , και βγάζει λάθος. μπορ να χωρίσω το $url να αντίστοιχη σε κάθε λινκ ξεχωριστά?
Noobie Δημοσ. 20 Μαρτίου 2015 Δημοσ. 20 Μαρτίου 2015 Ορίστε: (φυσικά εννοείται πως υπάρχει ήδη ο πίνακας $videos με τα urls) set_time_limit(0); //Παρακάμπτουμε το limit ώστε να τρέξει το script για όσο χρόνο χρειάζεται. function check_url($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_NOBODY, true); $data = curl_exec($ch); $headers = curl_getinfo($ch); curl_close($ch); return $headers['http_code']; } foreach ($videos as $video) { $check_url_status = check_url($video); if ($check_url_status == '200') echo "$video: <b>Working</b><br>"; else echo "$video: <b>Broken</b><br>"; } 1
thiva7 Δημοσ. 20 Μαρτίου 2015 Μέλος Δημοσ. 20 Μαρτίου 2015 μια ερώτηση μαθήσεις περισσότερο, μεσα στο foreach δεν μπορουμε να βάλουμε το function ? Ευχαριστώ πάντως edit: κατι ειναι λαθος μαλλον , βγαζει ολα τα λινκ broken ενω ειναι εκει τα βιντεο ... εμφανίζει Array: BrokenArray: BrokenArray: BrokenArray: BrokenArray: BrokenArray: BrokenArray: BrokenArray: BrokenArray: BrokenArray: Broken
Noobie Δημοσ. 20 Μαρτίου 2015 Δημοσ. 20 Μαρτίου 2015 μια ερώτηση μαθήσεις περισσότερο, μεσα στο foreach δεν μπορουμε να βάλουμε το function ? Ευχαριστώ πάντως edit: κατι ειναι λαθος μαλλον , βγαζει ολα τα λινκ broken ενω ειναι εκει τα βιντεο ... Μπορείς αλλά είναι κακή πρακτική να το κάνεις (και για λόγους επιδόσεων), στην ουσία θα δήλωνες ξανά και ξανά το ίδιο function χωρίς λόγο ενώ μπορείς να το δηλώσεις μια φορά και μετά να το χρησιμοποιήσεις όπου θες. Σωστός είναι ο κώδικας, θα πρέπει να μου δείξεις όλο τον κώδικα σου για να δω αν υπάρχει κάποιο λάθος αλλού. EDIT: Προφανώς έχεις ένα πολυδιάστατο πίνακα (δηλαδή πίνακας με άλλους πίνακες μέσα), δείξε μου όλο τον κώδικα και θα στο φτιάξω όπως πρέπει.
thiva7 Δημοσ. 20 Μαρτίου 2015 Μέλος Δημοσ. 20 Μαρτίου 2015 ο πινακας aspvideo collum url <?php define('_VALID', true); require 'libraries/bootstrap.php'; $db = VF::factory('database'); $db->query("SELECT url FROM aspvideo WHERE url != ''"); $videos = $db->fetch_rows(); function check_url($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_NOBODY, true); $data = curl_exec($ch); $headers = curl_getinfo($ch); curl_close($ch); return $headers['http_code']; } foreach ($videos as $video) { $check_url_status = check_url($video); if ($check_url_status == '200') echo "$video: <b>Working</b><br>"; else echo "$video: <b>Broken</b><br>"; } VF::close(); ?> αυτος ειναι ολος ο κωδικας
Noobie Δημοσ. 20 Μαρτίου 2015 Δημοσ. 20 Μαρτίου 2015 Καλά το κατάλαβα ότι τα παίρνεις από βάση, σε αυτήν την περίπτωση αντικατέστησε αυτό το κομμάτι: foreach ($videos as $video) { $check_url_status = check_url($video); if ($check_url_status == '200') echo "$video: <b>Working</b><br>"; else echo "$video: <b>Broken</b><br>"; } Με αυτό: foreach ($videos as $video) { $video_url = $video['url']; $check_url_status = check_url($video_url); if ($check_url_status == '200') echo "$video_url: <b>Working</b><br>"; else echo "$video_url: <b>Broken</b><br>"; } 1
thiva7 Δημοσ. 21 Μαρτίου 2015 Μέλος Δημοσ. 21 Μαρτίου 2015 τελικα πρεπει να την πατησεις για να μαθεις Δοκίμασα να τρεξω αυτο το κωδικα και εσβησα ολα τα hosted video απο την βαση χαχαχ foreach ($videos as $video) { $video_url = $video['url']; $check_url_status = check_url($video_url); if ($check_url_status == '200') echo "$video_url: <b>Working</b><br>"; else $broken = $video_url; $db->query("DELETE FROM video WHERE url = '$broken'"); } Ο κώδικας από τι κατάλαβα μετά είδε οτι αφου το url είναι κενό = broken άρα τα σβήσε όλα γιατι το url ηταν "γεματο" μονο για τα hotlinked βιντεο...και γω έτρεξα αυτο και τα έσβησα όλα μπορω να δωσω στο WHERE δυο φορες το ιδιο σημειο? πχ DELETE FROM video WHERE url = '$broken' AND url ! = ' ' ? την εκανα την μαλ@κια παλι
Noobie Δημοσ. 21 Μαρτίου 2015 Δημοσ. 21 Μαρτίου 2015 Εύχομαι να είχες πάρει backup, αν όχι, τότε το μάθημα είναι να παίρνεις πάντα backup, ειδικά όταν κάνεις τέτοιες δοκιμές. Από εκεί και πέρα, δεν χρειάζεται να αλλάξεις το query, το λάθος ήταν ότι το άφησες να εκτελεστεί και στις 2 περιπτώσεις, δηλαδή και όταν το link ήταν ok. Άρα αντικατέστησε αυτό το κομμάτι: if ($check_url_status == '200') echo "$video_url: <b>Working</b><br>"; else $broken = $video_url; $db->query("DELETE FROM video WHERE url = '$broken'"); Με αυτό: if ($check_url_status == '200') echo "$video_url: <b>Working</b><br>"; else $db->query("DELETE FROM video WHERE url = '$video_url'"); Έτσι, η διαγραφή θα γίνει μόνο αν το link δεν δουλεύει. (επίσης μην ανησυχείς, το $video_url δεν μπορεί να είναι κενό εφόσον ο πίνακας $videos δεν έχει εγγραφές με κενό URL, αυτό το φρόντισες με το πρώτο query στον κώδικα)
thiva7 Δημοσ. 21 Μαρτίου 2015 Μέλος Δημοσ. 21 Μαρτίου 2015 αυτο που εχασα ειναι λιγο...το δοκιμασα σε ενα μικρο μου σιτε. τελικα νευριασα και το εσβησα το σιτε θα το φτιαξω απο την αρχη το συγκεκριμενο απο την αρχη .αλλα τι διαφορα εχει ο δευτερος κωδικας?εχει σημασια αν $broken = $video_url; ? κοιταω ξανα κοιταω δεν βλεπω την διαφορα,στο δευτερο κωδικα παλι δεν θα βλεπει τα αδεια url?παντως εχεις ενα δικιο οτι ο πινακας $videos δεν έχει εγγραφές με κενό URL,Αυτο δεν λες $db->query("SELECT url FROM video WHERE url != ''"); ?αρα οταν το ετρεξα εγω γιατι το query με το delete ειδε και τα αδεια url και τα πηρε ολα......και με μπερδευει γιατι ειναι μετα το else αρα ισον broken. :/αα ξεχασα να σου πω....οτι κρατησε ΟΛΑ τα url που ειχαν εγγραφες και εσβησε οτι ΔΕΝ ειχε.αυτος ειναι ο κωδικας. <?php define('_VALID', true); require 'libraries/bootstrap.php'; $db = VF::factory('database'); $db->query("SELECT url FROM video WHERE url != ''"); $videos = $db->fetch_rows(); function check_url($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_NOBODY, true); $data = curl_exec($ch); $headers = curl_getinfo($ch); curl_close($ch); return $headers['http_code']; } foreach ($videos as $video) { $video_url = $video['url']; $check_url_status = check_url($video_url); if ($check_url_status == '200') echo "$video_url: <b>Working</b><br>"; else $broken = $video_url; $db->query("DELETE FROM video WHERE url = '$broken'"); } VF::close(); ?>
Noobie Δημοσ. 21 Μαρτίου 2015 Δημοσ. 21 Μαρτίου 2015 Η διαφορά είναι ότι στον δεύτερο κώδικα, το DELETE query εκτελείται μόνο αν το link είναι broken και σε καμία άλλη περίπτωση. Στον δικό σου κώδικα, το query εκτελείται σε όλα τα URLs. Αυτό που δεν κατάλαβες μάλλον είναι ότι για να γράψεις πάνω από 1 γραμμή σε ένα if/else statement, πρέπει να βάλεις αγκύλες, αν δεν βάλεις, τότε θεωρείται μόνο η πρώτη γραμμή ότι είναι στο statement. Αυτό που θα πρέπει να κάνεις λοιπόν είναι να βάλεις αγκύλες στο else εφόσον έχεις βάλει 2 γραμμές κώδικα. else { $broken = $video_url; $db->query("DELETE FROM video WHERE url = '$broken'"); } 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα