之前做微信登錄開(kāi)發(fā)時(shí)候,發(fā)現(xiàn)微信頭像圖片沒(méi)有后綴名,傳統(tǒng)的圖片抓取方式不奏效,需要特殊的抓取處理。所以,后來(lái)將各種情況結(jié)合起來(lái),封裝成一個(gè)類,分享出來(lái)。
創(chuàng)建項(xiàng)目
作為演示,我們?cè)趙ww根目錄創(chuàng)建項(xiàng)目grabimg,創(chuàng)建一個(gè)類GrabImage.php和一個(gè)index.php。
編寫類代碼
我們定義一個(gè)和文件名相同的類:GrabImage
class GrabImage{}
屬性
接下來(lái)定義幾個(gè)需要使用的屬性。
1、首先定義一個(gè)需要抓取的圖片地址:$img_url
2、再定義一個(gè)$file_name用來(lái)存儲(chǔ)文件的名稱,但是不攜帶拓展名,因?yàn)榭赡苌婕暗酵卣姑鼡Q,所以這里拆開(kāi)定義
3、緊接著就是拓展名$extension
4、然后我們定義一個(gè)$file_dir,該屬性的作用是,遠(yuǎn)程圖片抓取到本地后所存儲(chǔ)的目錄,一般相對(duì)于PHP入口文件所在的位置作為起始。但是該路徑一般不保存到數(shù)據(jù)庫(kù)。
5、最后我們定義一個(gè)$save_dir,顧名思義,該路徑是用來(lái)直接保存的數(shù)據(jù)庫(kù)的目錄。這里說(shuō)明下,我們不直接存儲(chǔ)文件保存路徑到數(shù)據(jù)庫(kù),一般是為了之后如果系統(tǒng)遷移,方便更換路徑做準(zhǔn)備。我們這里的$save_dir一般為日期 + 文件名,如果需要使用時(shí)候取出,在前方拼上所需要的路徑。
方法
屬性弄完了,接下來(lái)我們正式開(kāi)始抓取工作。
首先我們定義一個(gè)對(duì)外開(kāi)放的方法getInstances用來(lái)獲取一些數(shù)據(jù),比如抓取圖片地址,和本地保存路徑。同時(shí)將其放入屬性中。
public function getInstances($img_url , $base_dir) { $this->img_url = $img_url; $this->save_dir = date("Ym").'/'.date("d").'/'; // 比如:201610/19/ $this->file_dir = $base_dir.'/'.$this->save_dir.'/'; // 比如:./uploads/image/2016/10/19/ }
圖片保存路徑拼接完成,下面我們要注意一個(gè)問(wèn)題,目錄是否存在。日期在一天天走,但是目錄并不會(huì)自動(dòng)創(chuàng)建。所以,在保存圖片之前,首先需要檢查一下,如果當(dāng)前目錄不存在我們需要即時(shí)創(chuàng)建。
我們創(chuàng)建設(shè)置目錄方法setDir。屬性我們?cè)O(shè)置了private,安全
/** * 檢查圖片需要保持的目錄是否存在 * 如果不存在,則立即創(chuàng)建一個(gè)目錄 * @return bool */ private function setDir() { if(!file_exists($this->file_dir)) { mkdir($this->file_dir,0777,TRUE); } $this->file_name = uniqid().rand(10000,99999);// 文件名,這里只是演示,實(shí)際項(xiàng)目中請(qǐng)使用自己的唯一文件名生成方法 return true; }
接下來(lái)就是抓取核心代碼
第一步,解決一個(gè)問(wèn)題,我們需要抓取的圖片可能沒(méi)有后綴名。按照傳統(tǒng)的抓取方法,先抓取圖片,然后截取后綴名的方案不可行。
我們必須通過(guò)其它方法來(lái)獲得圖片類型。辦法就是從文件流信息中獲取文件頭信息,從而判斷文件mime信息,就可以知道文件后綴名。
為了方便,先定義一個(gè)mime和文件拓展名映射。
$mimes=array( 'image/bmp'=>'bmp', 'image/gif'=>'gif', 'image/jpeg'=>'jpg', 'image/png'=>'png', 'image/x-icon'=>'ico' );
這樣,當(dāng)我獲取了類型是image/gif的時(shí)候,我就可以知道是.gif圖片了。
利用php函數(shù)get_headers,獲取文件流頭信息。當(dāng)其值不為false時(shí)候我們將其賦值給變量$headers
取出Content-Type的值即為mime的值。
if(($headers=get_headers($this->img_url, 1))!==false){ // 獲取響應(yīng)的類型 $type=$headers['Content-Type']; }
使用上面我們定義的映射表,我們可以很輕松的獲取后綴名。
$this->extension=$mimes[$type];
當(dāng)然上面獲取的$type,可能不存在我們的映射表中,說(shuō)明這種類型文件并不是我們想要的,直接拋棄就好了,不用管它。
下面的步驟就和傳統(tǒng)抓取文件一樣。
$file_path = $this->file_dir.$this->file_name.".".$this->extension; // 獲取數(shù)據(jù)并保存 $contents=file_get_contents($this->img_url); if(file_put_contents($file_path , $contents)) { // 這里返回出去的值是直接保存到數(shù)據(jù)庫(kù)的路徑 + 文件名,形如:201610/19/57feefd7e2a7aY5p7LsPqaI-lY1BF.jpg return $this->save_dir.$this->file_name.".".$this->extension; }
首先獲取本地保圖片存完整路徑$file_path,接下來(lái)使用file_get_contents抓取數(shù)據(jù),然后使用file_put_contents保存到剛剛的文件路徑。
最后我們返回一個(gè)可以直接保存到數(shù)據(jù)庫(kù)中的路徑,而不是文件存儲(chǔ)路徑。
該抓取方法完整版是:
private function getRemoteImg() { // mime 和 擴(kuò)展名 的映射 $mimes=array( 'image/bmp'=>'bmp', 'image/gif'=>'gif', 'image/jpeg'=>'jpg', 'image/png'=>'png', 'image/x-icon'=>'ico' ); // 獲取響應(yīng)頭 if(($headers=get_headers($this->img_url, 1))!==false) { // 獲取響應(yīng)的類型 $type=$headers['Content-Type']; // 如果符合我們要的類型 if(isset($mimes[$type])) { $this->extension=$mimes[$type]; $file_path = $this->file_dir.$this->file_name.".".$this->extension; // 獲取數(shù)據(jù)并保存 $contents=file_get_contents($this->img_url); if(file_put_contents($file_path , $contents)) { // 這里返回出去的值是直接保存到數(shù)據(jù)庫(kù)的路徑 + 文件名,形如:201610/19/57feefd7e2a7aY5p7LsPqaI-lY1BF.jpg return $this->save_dir.$this->file_name.".".$this->extension; } } } return false; }
最后,為了簡(jiǎn)單,我們想在其他地方只要調(diào)用其中一個(gè)方法就可以完成抓取。所以,我們將抓取動(dòng)作直接放入到getInstances中,在配置完路徑后,直接抓取,所以,在初始化配置方法getInstances里新增代碼。
if($this->setDir()) { return $this->getRemoteImg(); } else { return false; }
測(cè)試
我們?nèi)倓倓?chuàng)建的index.php文件內(nèi)試試。
<?php require_once 'GrabImage.php'; $object = new GrabImage(); $img_url = "http://www.bidianer.com/img/icon_mugs.jpg"; // 需要抓取的遠(yuǎn)程圖片 $base_dir = "./uploads/image"; // 本地保存的路徑 echo $object->getInstances($img_url , $base_dir); ?>
惹,的確抓取過(guò)來(lái)了
完整代碼
* @link bidianer.com */ class GrabImage{ /** * @var string 需要抓取的遠(yuǎn)程圖片的地址 * 例如:http://www.bidianer.com/img/icon_mugs.jpg * 有一些遠(yuǎn)程文件路徑可能不帶拓展名 * 形如:http://www.xxx.com/img/icon_mugs/q/0 */ private $img_url; /** * @var string 需要保存的文件名稱 * 抓取到本地的文件名會(huì)重新生成名稱 * 但是,不帶拓展名 * 例如:57feefd7e2a7aY5p7LsPqaI-lY1BF */ private $file_name; /** * @var string 文件的拓展名 * 這里直接使用遠(yuǎn)程圖片拓展名 * 對(duì)于沒(méi)有拓展名的遠(yuǎn)程圖片,會(huì)從文件流中獲取 * 例如:.jpg */ private $extension; /** * @var string 文件保存在本地的目錄 * 這里的路徑是PHP保存文件的路徑 * 一般相對(duì)于入口文件保存的路徑 * 比如:./uploads/image/201610/19/ * 但是該路徑一般不直接存儲(chǔ)到數(shù)據(jù)庫(kù) */ private $file_dir; /** * @var string 數(shù)據(jù)庫(kù)保存的文件目錄 * 這個(gè)路徑是直接保存到數(shù)據(jù)庫(kù)的圖片路徑 * 一般直接保存日期 + 文件名,需要使用的時(shí)候拼上前面路徑 * 這樣做的目的是為了遷移系統(tǒng)時(shí)候方便更換路徑 * 例如:201610/19/ */ private $save_dir; /** * @param string $img_url 需要抓取的圖片地址 * @param string $base_dir 本地保存的路徑,比如:./uploads/image,最后不帶斜杠"/" * @return bool|int */ public function getInstances($img_url , $base_dir) { $this->img_url = $img_url; $this->save_dir = date("Ym").'/'.date("d").'/'; // 比如:201610/19/ $this->file_dir = $base_dir.'/'.$this->save_dir.'/'; // 比如:./uploads/image/2016/10/19/ return $this->start(); } /** * 開(kāi)始抓取圖片 */ private function start() { if($this->setDir()) { return $this->getRemoteImg(); } else { return false; } } /** * 檢查圖片需要保持的目錄是否存在 * 如果不存在,則立即創(chuàng)建一個(gè)目錄 * @return bool */ private function setDir() { if(!file_exists($this->file_dir)) { mkdir($this->file_dir,0777,TRUE); } $this->file_name = uniqid().rand(10000,99999);// 文件名,這里只是演示,實(shí)際項(xiàng)目中請(qǐng)使用自己的唯一文件名生成方法 return true; } /** * 抓取遠(yuǎn)程圖片核心方法,可以同時(shí)抓取有后綴名的圖片和沒(méi)有后綴名的圖片 * * @return bool|int */ private function getRemoteImg() { // mime 和 擴(kuò)展名 的映射 $mimes=array( 'image/bmp'=>'bmp', 'image/gif'=>'gif', 'image/jpeg'=>'jpg', 'image/png'=>'png', 'image/x-icon'=>'ico' ); // 獲取響應(yīng)頭 if(($headers=get_headers($this->img_url, 1))!==false) { // 獲取響應(yīng)的類型 $type=$headers['Content-Type']; // 如果符合我們要的類型 if(isset($mimes[$type])) { $this->extension=$mimes[$type]; $file_path = $this->file_dir.$this->file_name.".".$this->extension; // 獲取數(shù)據(jù)并保存 $contents=file_get_contents($this->img_url); if(file_put_contents($file_path , $contents)) { // 這里返回出去的值是直接保存到數(shù)據(jù)庫(kù)的路徑 + 文件名,形如:201610/19/57feefd7e2a7aY5p7LsPqaI-lY1BF.jpg return $this->save_dir.$this->file_name.".".$this->extension; } } } return false; } }

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

La méthode principale de création de fonctions de partage social dans PHP est de générer dynamiquement des liens de partage qui répondent aux exigences de chaque plate-forme. 1. Obtenez d'abord la page actuelle ou les informations d'URL et d'article spécifiées; 2. Utilisez UrLencode pour coder les paramètres; 3. épisser et générer des liens de partage en fonction des protocoles de chaque plate-forme; 4. Afficher les liens sur l'avant pour que les utilisateurs puissent cliquer et partager; 5. Générez dynamiquement des balises OG sur la page pour optimiser l'affichage du contenu du partage; 6. Assurez-vous d'échapper à la saisie des utilisateurs pour empêcher les attaques XSS. Cette méthode ne nécessite pas d'authentification complexe, a de faibles co?ts de maintenance et convient à la plupart des besoins de partage de contenu.

Pour réaliser la correction d'erreur de texte et l'optimisation de la syntaxe avec l'IA, vous devez suivre les étapes suivantes: 1. Sélectionnez un modèle ou une API d'IA appropriée, tels que Baidu, Tencent API ou bibliothèque NLP open source; 2. Appelez l'API via Curl ou Guzzle de PHP et traitez les résultats de retour; 3. Afficher les informations de correction d'erreur dans l'application et permettre aux utilisateurs de choisir d'adopter l'adoption; 4. Utilisez PHP-L et PHP_CODESNIFFER pour la détection de syntaxe et l'optimisation du code; 5. Collectez en continu les commentaires et mettez à jour le modèle ou les règles pour améliorer l'effet. Lorsque vous choisissez AIAPI, concentrez-vous sur l'évaluation de la précision, de la vitesse de réponse, du prix et du support pour PHP. L'optimisation du code doit suivre les spécifications du PSR, utiliser le cache raisonnablement, éviter les requêtes circulaires, revoir le code régulièrement et utiliser x

1. La maximisation de la valeur commerciale du système de commentaires nécessite de combiner la livraison précise de la publicité native, les services à valeur ajoutée par l'utilisateur (tels que le téléchargement d'images, les commentaires de recharge), d'influencer le mécanisme d'incitation basé sur la qualité des commentaires et la conformité de la monétisation anonyme des données de données; 2. La stratégie d'audit doit adopter une combinaison de mécanismes de filtrage des mots clés dynamiques pré-audit et de signalement des utilisateurs, complétés par une note de qualité des commentaires pour réaliser une exposition hiérarchique de contenu; 3. Anti-brosses nécessite la construction d'une défense multicouche: la vérification sans capteur RecaptChav3, le robot de reconnaissance de champ de miel, IP et la limite de fréquence d'horodatage empêchent l'arrosage, et la reconnaissance du modèle de contenu marque les commentaires suspects et itéra en continu pour traiter les attaques.

L'entrée vocale de l'utilisateur est capturée et envoyée au backend PHP via l'API MediaRecorder du JavaScript frontal; 2. PHP enregistre l'audio en tant que fichier temporaire et appelle STTAPI (tel que Google ou Baidu Voice Recognition) pour le convertir en texte; 3. PHP envoie le texte à un service d'IA (comme Openaigpt) pour obtenir une réponse intelligente; 4. PHP appelle ensuite TTSAPI (comme Baidu ou Google Voice Synthesis) pour convertir la réponse en fichier vocal; 5. PHP diffuse le fichier vocal vers l'avant pour jouer, terminant l'interaction. L'ensemble du processus est dominé par PHP pour assurer une connexion transparente entre toutes les liens.

PHP n'effectue pas directement un traitement d'image AI, mais s'intègre via les API, car il est bon dans le développement Web plut?t que dans les taches à forte intensité informatique. L'intégration de l'API peut atteindre une division professionnelle du travail, réduire les co?ts et améliorer l'efficacité; 2. Intégration des technologies clés incluez l'utilisation de Guzzle ou Curl pour envoyer des demandes HTTP, le codage et le décodage des données JSON, l'authentification de la sécurité des clés de l'API, les taches de traitement de la file d'attente asynchrones, les taches prenant du temps, la gestion des erreurs robuste et le mécanisme de retrait, le stockage et l'affichage d'images; 3. Les défis courants incluent le co?t des API incontr?lable, les résultats de génération incontr?lables, la mauvaise expérience utilisateur, les risques de sécurité et la gestion difficile des données. Les stratégies de réponse consistent à définir des quotas et des caches utilisateur, en fournissant des conseils ProTT et une sélection multi-images, des notifications asynchrones et des invites de progrès, un stockage et un audit de contenu de la variable d'environnement clé et un stockage cloud.

PHP assure l'atomicité de la déduction des stocks via les transactions de base de données et les verrous en ligne de Forupdate pour empêcher la survente élevée élevée en simultation; 2. La cohérence de l'inventaire multiplateforme dépend de la gestion centralisée et de la synchronisation axée sur les événements, combinant des notifications API / WebHook et des files d'attente de messages pour assurer une transmission fiable de données; 3. Le mécanisme d'alarme doit définir un faible inventaire, un inventaire zéro / négatif, des ventes invidables, des cycles de réapprovisionnement et des stratégies de fluctuations anormales dans différents scénarios, et sélectionner Dingtalk, SMS ou les personnes responsables par e-mail en fonction de l'urgence, et les informations d'alarme doivent être complètes et claires pour réaliser l'adaptation et la réponse rapide.

PHP fournit une base d'entrée pour les modèles d'IA en collectant des données utilisateur (telles que l'historique de navigation, la localisation géographique) et le prétraitement; 2. Utilisez Curl ou GRPC pour se connecter avec les modèles d'IA pour obtenir les résultats de prédiction de taux de clics et de taux de conversion; 3. Ajuster dynamiquement la fréquence d'affichage publicitaire, la population cible et d'autres stratégies basées sur les prédictions; 4. Testez différentes variantes publicitaires via A / B et enregistrez les données et combinez une analyse statistique pour optimiser l'effet; 5. Utilisez PHP pour surveiller les sources de trafic et les comportements des utilisateurs et intégrer avec des API tierces telles que Googleads pour réaliser la livraison automatisée et l'optimisation de rétroaction continue, améliorer finalement CTR et CVR et réduire le CPC, et implémenter pleinement la boucle fermée du système publicitaire basé sur l'IA.

PhpisstillRelevantinmodernerterpriseenvironments.1.modernPhp (7.xand8.x) offre des performances, des stricts, un jitcompilation, et modernsyntax, rendant la main
