成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > Laravel第三方包報(bào)class not found的解決方法

Laravel第三方包報(bào)class not found的解決方法

熱門標(biāo)簽:電銷招聘機(jī)器人 事業(yè)單位如何百度地圖標(biāo)注 天津營銷電話機(jī)器人加盟代理 福泉電話機(jī)器人 南寧crm外呼系統(tǒng)平臺 熱線電話機(jī)器人 地圖標(biāo)注入哪個(gè)科目 格陵蘭島地圖標(biāo)注 太原極信防封電銷卡

出現(xiàn)的問題

公司開發(fā)使用PHP,技術(shù)框架使用Laravel。最近線上出現(xiàn)一個(gè)問題,就是上線之后,每次都會出錯(cuò)。查看出錯(cuò)原因,是composer安裝的第三方出現(xiàn)class not found。因?yàn)檫@個(gè)問題,在線下使用Lumen框架的時(shí)候,遇到過,查找問題原因是因?yàn)橐蕾嚨腸omposer包中composer.json中的”autoload”:{“psr-4”:{}}書寫格式問題。解決方法使用命令:composer dump-autoload -o;

雖然知道問題的所在,但是有一個(gè)現(xiàn)象比較費(fèi)解:這個(gè)第三方包已經(jīng)使用很久了,為什么最近才開始報(bào)錯(cuò)呢?下面就開始查找出錯(cuò)原因

解決方案

如果確認(rèn)第三方包已安裝,并且正確使用use引用了,嘗試執(zhí)行composer dump-autoload -o

最終結(jié)果

因?yàn)榭赡芷鶗容^長,所以這里先說明一下最終問題處理結(jié)果:原因還未準(zhǔn)確定位到,現(xiàn)推測發(fā)布服務(wù)器環(huán)境問題,但因?yàn)榘l(fā)布服務(wù)器監(jiān)控服務(wù)較多,不允許進(jìn)行測試,所以具體環(huán)境哪個(gè)配置導(dǎo)致的問題,還沒有定位到。

下面主要介紹問題解決過程:

 1. 查看laravel autoload
 2. 查看composer源碼;
 3. 重新編譯composer打印日志;
 4. 分析composer install過程;
 5. 查看php artisan optimize源碼

對分析查找問題的過程感興趣的同學(xué)可以繼續(xù)往下看。

問題分析及解決過程

1. 查找class not found原因

分析

既然class not found,確認(rèn)composer包已經(jīng)安裝。那問題就確定在autoload過程

查看源碼

首先自動(dòng)加載入口 public/index.php 中

require __DIR__.'/../bootstrap/autoload.php';

然后繼續(xù)進(jìn)入 bootstrap/autoload.php 文件

require __DIR__.'/../vendor/autoload.php';

然后繼續(xù)進(jìn)入 vendor/autoload.php

// require 自動(dòng)加載類
require_once __DIR__ . '/composer/autoload_real.php';

// 真正返回文件列表的操作
return ComposerAutoloaderInit3f39d071b2e74e04102a9c9b6f221123::getLoader();

進(jìn)入getLoader()方法中

public static function getLoader()
{
 if (null !== self::$loader) {
 return self::$loader;
 }

 // 注冊自動(dòng)加載方法,用來后面初始化ClassLoader類
 spl_autoload_register(array('ComposerAutoloaderInit3f39d071b2e74e04102a9c9b6f221123', 'loadClassLoader'), true, true);
 // 初始化ClassLoarder
 self::$loader = $loader = new \Composer\Autoload\ClassLoader();
 spl_autoload_unregister(array('ComposerAutoloaderInit3f39d071b2e74e04102a9c9b6f221123', 'loadClassLoader'));

 // 這里zend_loader_file_encoded查了一下,解釋為:
 // Returns TRUE if the current file was encoded with Zend Guard or FALSE otherwise. If FALSE, consider disabling the Guard Loader
 // 又查了一下Zend Guard,貌似是php代碼加密并提高執(zhí)行效率的,提高有限,比較雞肋
 // 打印了一下,發(fā)現(xiàn)不存在這個(gè)方法,即!function_exists('zend_loader_file_encoded')為true
 $useStaticLoader = PHP_VERSION_ID >= 50600  !defined('HHVM_VERSION')  (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
 if ($useStaticLoader) {
 // 程序在這里執(zhí)行
 // 引用ComposerStaticInit類
 require_once __DIR__ . '/autoload_static.php';

 // 調(diào)用ComposerStaticInit類中的getInitializer方法
 // 主要作用是使用ComposerStaticInit類中的值初始化上面創(chuàng)建的ComposerAutoloader對象中的prefixLengthsPsr4、prefixDirsPsr4、prefixesPsr0、classMap等值
 call_user_func(\Composer\Autoload\ComposerStaticInit3f39d071b2e74e04102a9c9b6f221123::getInitializer($loader));
 } else {
 $map = require __DIR__ . '/autoload_namespaces.php';
 foreach ($map as $namespace => $path) {
  $loader->set($namespace, $path);
 }

 $map = require __DIR__ . '/autoload_psr4.php';
 foreach ($map as $namespace => $path) {
  $loader->setPsr4($namespace, $path);
 }

 $classMap = require __DIR__ . '/autoload_classmap.php';
 if ($classMap) {
  $loader->addClassMap($classMap);
 }
 }

 // 重點(diǎn)在這個(gè)方法
 $loader->register(true);

 if ($useStaticLoader) {
 $includeFiles = Composer\Autoload\ComposerStaticInit3f39d071b2e74e04102a9c9b6f221123::$files;
 } else {
 $includeFiles = require __DIR__ . '/autoload_files.php';
 }
 foreach ($includeFiles as $fileIdentifier => $file) {
 composerRequire3f39d071b2e74e04102a9c9b6f221123($fileIdentifier, $file);
 }

 return $loader;
}

ClassLoader的register方法

public function register($prepend = false)
{
 // 調(diào)用ClassLoader類的loadClass方法
 spl_autoload_register(array($this, 'loadClass'), true, $prepend);
}

ClassLoader類的loadClass方法

public function loadClass($class)
{
 // 查找文件,如果查找到文件,則加載文件
 if ($file = $this->findFile($class)) {
 includeFile($file);

 return true;
 }
}

ClassLoader類的findFile方法

public function findFile($class)
{
 // class map lookup
 // class map加載方式,我的理解:是通過將類與對應(yīng)路徑生成一個(gè)對應(yīng)表
 // 該方式優(yōu)點(diǎn):加載速度快,相當(dāng)于查詢字典;
 // 缺點(diǎn):無法實(shí)現(xiàn)自動(dòng)加載,添加新類后,需要對應(yīng)維護(hù)class map
 if (isset($this->classMap[$class])) {
 return $this->classMap[$class];
 }

 // $classMapAuthoritative默認(rèn)值為false,流程到目前,沒有設(shè)置過該值
 // $missingClasses通過查看該方法最后幾行,發(fā)現(xiàn)作用是記錄自動(dòng)加載過程中不存在的文件
 // 所以這里第一次加載會返回false
 if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
 return false;
 }

 // APCu 是老牌 PHP 字節(jié)碼和對象緩存,緩存器 APC 的分支(PS:我也是查的,不懂呀~大家感興趣可以自己深研究)
 // 經(jīng)測試,$this->apcuPrefix=null
 if (null !== $this->apcuPrefix) {
 $file = apcu_fetch($this->apcuPrefix.$class, $hit);
 if ($hit) {
  return $file;
 }
 }

 // 最后一層方法(保證是最后一個(gè)方法)
 $file = $this->findFileWithExtension($class, '.php');

 // Search for Hack files if we are running on HHVM
 if (false === $file  defined('HHVM_VERSION')) {
 $file = $this->findFileWithExtension($class, '.hh');
 }

 if (null !== $this->apcuPrefix) {
 apcu_add($this->apcuPrefix.$class, $file);
 }

 // 記錄無法找到的類,方便再次加載直接返回
 if (false === $file) {
 // Remember that this class does not exist.
 $this->missingClasses[$class] = true;
 }

 return $file;
}

ClassLoader類中findFileWithExtension方法

private function findFileWithExtension($class, $ext)
{
 // 終于看到加載psr-4了
 // PSR-4 lookup
 // 對路徑中的\轉(zhuǎn)換為文件系統(tǒng)中對應(yīng)路徑分隔符并+后綴,
 // 比如wan\test類,最后處理為wan/test.php(linux下)
 $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;

 // 獲得類名中第一個(gè)字母,主要用于在ClassLoader中prefixLengthsPsr4快速檢索包,并找到對應(yīng)包前綴長度,后面截取時(shí)使用
 // 對比autoload_static.php中的$prefixLengthsPsr4即可明白作用
 $first = $class[0];
 if (isset($this->prefixLengthsPsr4[$first])) {
 $subPath = $class;
 while (false !== $lastPos = strrpos($subPath, '\\')) {
  // 從右往左一層層循環(huán)類名中的路徑
  $subPath = substr($subPath, 0, $lastPos);
  $search = $subPath.'\\';
  // 找到對應(yīng)composer包前綴后,取出對應(yīng)路徑,將包前綴截取后,替換成對應(yīng)的目錄路徑,即為class所對應(yīng)文件
  if (isset($this->prefixDirsPsr4[$search])) {
  foreach ($this->prefixDirsPsr4[$search] as $dir) {
   $length = $this->prefixLengthsPsr4[$first][$search];
   if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
   return $file;
   }
  }
  }
 }
 }

 // 到這里psr-4文件就加載完了,后面是psr-0等其他文件加載,這里就不分析了。
 // 這里分析一下為什么是第三方包psr-4格式錯(cuò)誤
 // 比如包名為wan/lib,即composer安裝命令對應(yīng)composer require wan/lib
 // 第三方包中autoload psr-4配置為 "psr-4" : { "wan\\" : "src" } 
 // (**警告:上面是錯(cuò)誤配置,為了舉例說明;正確應(yīng)該是"psr-4" : { "wan\\lib\\" : "src" })
 // 最終生成的$prefixLengthsPsr4為{'w' =>array ('wan\\' => 5,),}
 // 生成$prefixDirsPsr4為'wan\\' => array (0 => __DIR__ . '/..' . '/wan/lib/src',),
 // 對應(yīng)上面代碼,在最后$file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length)
 // $file拼接出來的路徑是vendor/wan/lib/src/lib/$className.php,導(dǎo)致最后無法拼接出正確路徑

 // PSR-4 fallback dirs
 foreach ($this->fallbackDirsPsr4 as $dir) {
 if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
  return $file;
 }
 }

 // PSR-0 lookup
 if (false !== $pos = strrpos($class, '\\')) {
 // namespaced class name
 $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
  . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
 } else {
 // PEAR-like class name
 $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
 }

 if (isset($this->prefixesPsr0[$first])) {
 foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
  if (0 === strpos($class, $prefix)) {
  foreach ($dirs as $dir) {
   if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
   return $file;
   }
  }
  }
 }
 }

 // PSR-0 fallback dirs
 foreach ($this->fallbackDirsPsr0 as $dir) {
 if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
  return $file;
 }
 }

 // PSR-0 include paths.
 if ($this->useIncludePath  $file = stream_resolve_include_path($logicalPathPsr0)) {
 return $file;
 }

 return false;
}

總結(jié)

因?yàn)椴檎疫^程比較長,導(dǎo)致篇幅也比較長。所以決定拆分成多篇文章說明。

到這里,通過查找問題,把Laravel框架autoload機(jī)制源碼分析了一遍,也學(xué)會了composer包中對應(yīng)autoload信息中psr-4及classmap信息如何配置。

后續(xù)文章中會通過查看分析composer源碼及php artisan命令源碼,分析為什么本地開發(fā)環(huán)境及測試環(huán)境沒有出現(xiàn)class not found情況

以上這篇Laravel第三方包報(bào)class not found的解決方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Laravel 加載第三方類庫的方法
  • php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解決方法

標(biāo)簽:佳木斯 通化 香港 郴州 金華 寶雞 阿克蘇 自貢

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Laravel第三方包報(bào)class not found的解決方法》,本文關(guān)鍵詞  Laravel,第三方,包報(bào),class,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Laravel第三方包報(bào)class not found的解決方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于Laravel第三方包報(bào)class not found的解決方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产激情综合| 国产精品1区| 欧美成人午夜77777| 日韩欧美一级| 狠狠97人人婷婷五月| 红桃视频 国产| 97在线看免费观看视频在线观看| 欧美色图校园春色| 久久精品99国产精品酒店日本| 亚州精品视频| av色图一区| 91精品视频免费| 思99热精品久久只有精品| 大桥未久在线视频| 欧美亚洲国产日本| 免费视频91| 中文字幕在线第一页| 欧美巨胸大乳hitomi| 国产又爽又黄视频| 91一区二区三区四区| 国产调教精品| 亚洲欧美制服综合另类| 日韩久久久精品| 国产又爽又黄无码无遮挡在线观看| 亚洲天堂av在线免费观看| 色综合久久中文字幕| 欧美福利视频一区| 爱情岛论坛vip永久入口| 蜜桃一区二区三区在线| 波多野结衣视频在线观看| 免费不卡av网站| 超碰在线播放91| 日韩欧美国产二区| 中文字幕一区免费在线观看| 欧美激情论坛| 成人三级在线| 日韩电影在线观看永久视频免费网站| www国产成人免费观看视频 深夜成人网| 成人性教育av免费网址| 欧美中文字幕在线观看视频| juy有坂深雪中文字幕| 国产精品视频一区二区三区,| 欧美日韩日日骚| 亚洲人成网站免费播放| 一区福利视频| 国产伦精品一区二区三区照片| www.天堂乱色| 97超碰免费观看| 瑟瑟视频在线免费观看| 国产精品久久久久久吹潮| 亚洲欧美色婷婷| yourporn在线观看中文站| 中文字幕制服诱惑| 午夜精品久久久久久久爽| 99久久精品费精品国产风间由美| 久久精品72免费观看| 国产精品大片wwwwww| jlzzjlzz欧美| 免费在线观看黄| 精品无码国产一区二区三区av| 亚洲国产精品久久久久婷婷884| 欧美成人se01短视频在线看| 欧美专区在线视频| 亚洲盗摄视频| 蜜桃久久精品一区二区| 久久老女人爱爱| 一区二区三区四区激情| 2025国产精品自拍| 男人的天堂av网| 天堂а√在线8种子蜜桃视频| 一个人看的日本www的免费视频| www.男人天堂| 香蕉成人app免费看片| 国产精品色呦| 国产91在线播放精品| 精产国品自在线www| 欧美四级剧情无删版影片| 欧美日韩精品一区二区三区四区| 欧美日韩免费一区二区三区视频| 蜜桃传媒在线观看免费进入| 久久久7777| 欧美国产日韩一区二区| 极品粉嫩美女露脸啪啪| 国产欧美精品一区二区| av在线播放免费| 免费黄色在线视频| xxxxwwww在线免费观看| 黄色高清视频| 99re热久久这里只有精品34| 午夜一级久久| 久久国产成人精品| 午夜在线视频一区二区区别| 日韩精品一区二区亚洲av性色| 97精品国产| 中文字幕中文在线不卡住| 91豆花视频在线播放| 欧美亚洲另类制服自拍| 91麻豆蜜桃| 社区色欧美激情 | 欧美多人野外伦交| 色婷婷精品久久二区二区蜜臀av| 好色先生视频污| 中文字幕 在线观看| 日日夜夜精品视频| 超碰超碰97| 久久国产欧美精品| free极度另类性欧美| 成人羞羞视频免费看看| 丁香桃色午夜亚洲一区二区三区| 日本成人黄色片| 亚洲春色在线视频| 日韩一区二区三区观看| 欧美激情videos| 国产麻豆乱码精品一区二区三区| 久久欧美肥婆一二区| 欧美男插女视频| 免费色片视频| 午夜电影一区二区三区| 波多野结衣电车痴汉| 国产欧美熟妇另类久久久| 亚洲黄色在线观看| 欧美a一片xxxx片| 天天综合网色中文字幕| 黑人巨大40cm重口| 中文字幕在线播出| 欧美顶级大胆免费视频| 久久一区激情| 亚洲男人天堂九九视频| 亚州欧美一区三区三区在线| 人人爽人人爽人人片av| 国产欧美日韩综合一区在线播放| 污视频免费在线观看网站| 国产精品视频一区二区图片| 影音先锋男人资源在线观看| 爱爱视频网站| 桃乃木香奈av在线| 国产人成高清视频观看| 国产精品久久久久久久久久久免费看| 国产精品一区二区三区四区色| 国产寡妇树林野战在线播放| 国产亚洲精品久久久久久无几年桃| 欧美另类videoxo高潮| 色综合久久久久| 你懂的视频在线| 亚洲午夜精品在线观看| 中文字幕 国产| 免费白浆视频| 亚洲欧美在线专区| 亚洲女同精品视频| 久草手机视频在线观看| 国产免费一区二区三区香蕉精| 亚洲福利天堂| 国产视频二区三区| 日韩av中文在线观看| 免费av一区二区三区四区| 欧美亚洲禁片免费| 99精品老司机免费视频| 久久99国产精品久久99| 国产91久久婷婷一区二区| 精品女同一区二区三区在线观看| 91视频免费在线看| h视频在线免费看| 日日夜夜免费精品视频| 国产亚洲污的网站| 国产v亚洲v天堂无码久久久| 精品久久一二三| 日本久久精品电影| 亚洲午夜激情av| 日本暖暖在线视频| 久久久成人免费视频| 91精品国产麻豆国产在线观看| www.xxxx日本| 国产麻豆剧果冻传媒观看hd高清| 色老头久久综合| 欧美岛国激情| 欧洲不卡视频| 日本动漫同人动漫在线观看| 99亚洲视频| 超碰人人干人人| 色偷偷色偷偷色偷偷在线视频| 中文字幕日韩综合| 91久久在线视频| 色婷婷av一区二区三| 亚洲精品久久久久国产| 欧美一区二区视频在线观看2020| 午夜精品久久久久久久久久蜜桃| 亚洲高清福利| 在线中文字日产幕| 久草免费在线观看视频| 牛牛影视久久网| av影片免费在线观看| 欧美日韩国产成人在线观看| 91精品国产一区二区| 国产xxx精品视频大全| 日本中文字幕不卡免费| www视频在线免费观看| 毛片视频免费播放| 亚洲视频中文字幕在线观看| 久久综合久久综合久久综合| 成人免费观看a| 国产高清无密码一区二区三区| japan高清日本乱xxxxx| 视频一区日韩精品| 给我看免费高清在线观看| av高清久久久| 婷婷六月综合网| 色国产精品一区在线观看| 国产主播在线资源| 亚洲av成人片色在线观看高潮| 欧美日韩视频网站| 国产精品swag| 人人狠狠综合久久亚洲婷婷| 成 年 人 黄 色 大 片大 全| 中文av字幕一区| 91cn在线观看| 五月激情综合婷婷| 亚洲国产高清不卡| 一本一道久久综合狠狠老精东影业| 高清hd写真福利在线播放| 性生活视频网址| 丁香婷婷久久| 手机看片福利视频| 国产精品a久久久久久| 国产一线二线三线女| 五月激情丁香一区二区三区| 国产香蕉一区二区三区在线视频| 四虎影视网站| 精品动漫3d一区二区三区免费| 456亚洲精品成人影院| 国产情侣一区二区| 日b视频在线观看| 最近2018年中文字幕在线| 亚洲国产高清av| 国产99久久精品一区二区 夜夜躁日日躁| 国产清纯美女被跳蛋高潮一区二区久久w| 亚洲av无码不卡| 蜜桃视频www网站在线观看| 久久精品国产99久久6| 国产视频97| 欧美视频一二区| 成年网站在线在免费播放| 国产美女精品在线| 欧美wwwww| 欧美色区777第一页| av不卡一区| 中文字幕乱码亚洲精品一区| 狠狠爱综合网| 麻豆精品国产91久久久久久| 国产午夜精品全部视频在线播放| 亚洲成人精品久久| 久久99久久人婷婷精品综合| www.黄色国产| 国产精品视频你懂的| 韩国成人精品a∨在线观看| 成人av电影在线网| 亚洲人精品午夜在线观看| 欧美亚洲视频一区| 欧美日韩精品二区| 波多野吉衣在线视频| 国产在线观看免费一区| 欧美激情啊啊啊| 久久综合色8888| 北条麻妃一区二区三区在线| 亚洲专区在线播放| 日韩免费视频播放| 最近的中文字幕在线看视频| 深夜福利网站在线观看| 成年网站在线观看| 久久91精品国产91久久小草| av自拍一区| 国产精品无码永久免费888| 精品在线免费视频| 大胆人体一区二区| 在线免费黄网| 久久精品女人天堂av免费观看| 神马影院我不卡| 久久99九九99精品| 69xx绿帽三人行| 精品一区二区免费| 亚洲女同性videos| 亚洲国产另类精品专区| 亚洲一区二区精品久久av| 国产精品久久久久久久久久99| 久久99精品久久久久| 欧美日韩激情在线一区二区三区| 性猛交富婆╳xxx乱大交天津| 久久在线免费视频| 中文字幕网站在线观看| 久久av免费一区| 亚洲永久无码7777kkk| 麻豆精品国产91久久久久久| 一级片免费观看视频| 色www永久免费视频首页在线| 日本三日本三级少妇三级66| 欧美成人精品一级| 99久久免费国产精品| 国产乱国产乱老熟300| 伊人久久噜噜噜躁狠狠躁| 欧美日韩久久久一区| 成人午夜影视| 国产精品久久国产| 日本国产中文字幕| 午夜精品国产| 国产在线一二| 日韩成人av网| 亚洲天堂久久久久久久| 婷婷四房综合激情五月| 免费久久99精品国产自在现线| 韩国一区二区视频| 粉嫩av一区二区三区粉嫩| 日韩精品一二三四区| 欧美大片一区二区三区| 日韩无码精品一区二区| 香蕉久久国产av一区二区| 成人三级高清视频在线看| 欧美日韩国产综合视频在线| 在线视频99| 国产精品一区二区三区久久| 亚洲精品一二三区| 试看120秒一区二区三区| 亚洲+小说+欧美+激情+另类| 黄色av电影在线播放| 亚洲国产成人自拍| 欧美日本一区二区三区| 亚洲瘦老头同性70tv| 欧美成熟视频| xxxx欧美xxxx黑人| 亚洲三级久久久|