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

主頁 > 知識庫 > Yii2框架中一些折磨人的坑

Yii2框架中一些折磨人的坑

熱門標(biāo)簽:青島語音外呼系統(tǒng)招商 百應(yīng)電話機器人服務(wù) 山西回?fù)芡夂粝到y(tǒng) 揚州地圖標(biāo)注app 河南電銷卡外呼系統(tǒng)哪家強 山西探意電話機器人 岳陽外呼型呼叫中心系統(tǒng)在哪里 騰訊外呼管理系統(tǒng) 昭通辦理400電話

說點閑話

距離上次寫博客,已經(jīng)有一年了。在動手寫之前,總是帶著深深的罪惡感。被它折磨許久,終于,還是,動手了。

值得慶祝的一件事:最近開始健身了。每天動感單車45分鐘,游泳45分鐘,真的是(生)爽(不)到(如)爆(死)。

好了,扯淡完畢,步入正題。

ActiveRecord被莫名寫入?

準(zhǔn)備知識

ActiveRecord的基本用法。如果不理解,可參考這里。

代碼現(xiàn)場

/**
 * @property integer $id
 * @property string $name
 * @property string $detail
 * @property double $price
 * @property integer $area
 **/
class OcRoom extends ActivieRecord
{
 ...
}

$room = OcRoom::find()  //先取出一個對象。
 ->select(['id'])  //只取出'id'列
 ->where(['id'=>20])
 ->one();
$room->save();    //保存,會發(fā)現(xiàn)此行的其它字段都被寫成默認(rèn)值了。

總結(jié)問題

這個例子的問題在于:

  1. 我從數(shù)據(jù)庫中取出了一行,也就是代碼中的$room,但是只取出了id字段,而其他字段自然就是默認(rèn)值。
  2. 當(dāng)我$room->save()的時候,那些是默認(rèn)值的字段也被保存到數(shù)據(jù)庫里去了。what!?
  3. 也就是說,當(dāng)你想節(jié)約資源,不取出所有字段的時候,一定要注意不能保存,否則,很多數(shù)據(jù)會被莫名修改為默認(rèn)值。

解決方法

然而,我們有什么解決辦法呢?提供幾種思路:

  1. 自己時刻注意,避免未完全取出的ActiveRecord的保存。
  2. 修改或繼承ActiveRecord, 使得,當(dāng)此對象由find()新建,且字段沒有完全取出,調(diào)用save()方法,拋出異常。
  3. 修改或繼承ActiveRecord,使得,當(dāng)此對象由find()新建,且字段沒有完全取出,調(diào)用save()方法時,只保存取出過的字段,其他字段被忽略。

你的Transaction生效了嗎?

代碼現(xiàn)場

/**
 * @property integer $id
 * @property string $name
 **/
class OcRoom extends ActiveRecord
{
 public function rules()
 {
  return [['name','string','min'=>2,'max'=>10]];
 }
 ...
}
class OcHouse extends ActiveRecord
{
 public function rules()
 {
  return [['name','string','max'=>10]];
 }
 ...
}

$a = new OcRoom();
$a->name = '';    //name為空字符串,不滿足rules()條件。

$b = new OcHouse();
$b->name = '我的房間';   //name合法,可以保存。

$transaction = Yii::$app->db->beginTransaction();
try{
 $a->save();    //name字段不合法,無法驗證通過,在validate()階段已經(jīng)返回false,不會進行數(shù)據(jù)庫存儲的步驟,所以也不會拋出異常。
 $b->save();    //name字段合法,可以正常保存。

 $transaction->commit(); //提交后,發(fā)現(xiàn)$a保存失敗,而$b保存成功。
}
catch (Exception $e) 
{
 Yii::error($e->getTraceAsString(),__METHOD__);
 $transaction->rollBack();
}

問題總結(jié)

這段代碼的問題在于:

  1. 大家知道$transaction的存在意義是保證整段數(shù)據(jù)庫存儲代碼要么全成功,要么全失敗。
  2. 顯然,在這個例子中,transaction并沒有達到我們想要的效果:$a因為validate()都沒過,所以$transation->commit()的時候并不會報錯。

解決方法

在$transation塊內(nèi),所有的save()都要判斷下返回值,如果為false,則直接拋出異常。

'Y-m-d'不被識別?

代碼現(xiàn)場

OcRenterBill extends ActiveRecord
{
 public function rules()
 {
  return [
   ['start_time','date','format'=>'Y-m-d'],
  ];
 }
}

$a = new OcRenterBill();
$a = '2015-09-12';
$a->save();     //會報錯,說格式不對

問題總結(jié)

如果一開始,Yii框架就報錯,這個還不算坑??拥氖俏以贛ac上開發(fā)時,這個可以完全正常的工作,而發(fā)布到線上環(huán)境(Ubuntu)后,就彈出“屬性start_time格式無效”的錯誤。而參考官方文檔,發(fā)現(xiàn)這種格式是允許的官方文檔。

啊啊啊。各種試錯,最后發(fā)現(xiàn)如果改成php:Y-m-d,世界就清凈了。所以,如果你遇到這種問題,感激我吧。

內(nèi)存泄露

代碼現(xiàn)場

public static function actionTest() {
  $total = 10;
  var_dump('開始內(nèi)存'.memory_get_usage());
  while($total){
   $ret=User::findOne(['id'=>910002]);
   var_dump('end內(nèi)存'.memory_get_usage());
   unset($ret);
   $total--;
  }
 }

上面代碼的內(nèi)存一直在增長, 按照原本想法來看, 變量被釋放了,內(nèi)存就算增長也不會一直增長。因為每循環(huán)一次內(nèi)存都會被釋放。

分析問題 上面這段代碼涉及到了數(shù)據(jù)庫的操作,而我們知道,數(shù)據(jù)庫的很多地方都能引起內(nèi)存泄漏。 所以先屏蔽數(shù)據(jù)庫相關(guān)操作, 我手寫了一個原生的數(shù)據(jù)庫查詢操作, 發(fā)現(xiàn)內(nèi)存正常,沒有問題。

$dsn = "mysql:dbname=test;host=localhost";
$db_user = 'root';
$db_pass = 'admin';
//查詢
$sql = "select * from buyer";
$res = $pdo->query($sql);
foreach($res as $row) {
 echo $row['username'].'br/>';
}

這時候答案呼之欲出--- 是yii2框架搞了鬼

定位問題 既然知道了是yii2 框架的問題那就可以進一步縮小問題。

public static function actionTest() {
  $total = 10;
  var_dump('開始內(nèi)存'.memory_get_usage());
  while($total){
   $ret= new User();
   var_dump('end內(nèi)存'.memory_get_usage());
   unset($ret);
   $total--;
  }
 }

內(nèi)存還是一直增長。 這時候我測試了一個其他的yii2類 發(fā)覺內(nèi)存不增長了。 這就可以聯(lián)想到是在new 對象的時候yii2內(nèi)部自己執(zhí)行了什么操作,然后導(dǎo)致內(nèi)存泄漏。 什么方法是new 的時候就執(zhí)行的呢。。。 對的 構(gòu)造方法 __construct 。 然后 我一步一步的從model 查到object 發(fā)覺都沒有能引起泄漏的地方。

這個時候我們不妨換個思路, 既然是yii2框架下出現(xiàn)的泄漏, 那肯定就是yii2獨有的功能, 那什么功能是yii2獨有的,又是在new 對象的時候就會執(zhí)行的呢?

行為(Behavior) 發(fā)覺我的模型類里面果然有用了行為

public function behaviors()
 {
  return [
   TimestampBehavior::class,
  ];
 }

最普通不過的代碼。 我們知道 行為最后調(diào)用的地方是 yii\base\Component->attachBehaviors 最后定位到

private function attachBehaviorInternal($name, $behavior)
 {
  if (!($behavior instanceof Behavior)) {
   $behavior = Yii::createObject($behavior);
  }
  if (is_int($name)) {
   $behavior->attach($this);
   $this->_behaviors[] = $behavior;
  } else {
   if (isset($this->_behaviors[$name])) {
    $this->_behaviors[$name]->detach();
   }
   $behavior->attach($this);
   $this->_behaviors[$name] = $behavior;
  }
 
  return $behavior;
 }

我們觀察這段代碼,發(fā)覺他把自己傳進去了$behavior->attach($this); 最后調(diào)用的是 yii\base\Behavior->attach

public function attach($owner)
 {
  $this->owner = $owner;
  foreach ($this->events() as $event => $handler) {
   $owner->on($event, is_string($handler) ? [$this, $handler] : $handler);
  }
 }

問題總結(jié)

這個時候答案已經(jīng)呼之欲出, Yii2為了實現(xiàn)行為這一功能, 把自身this傳進去,以便能注冊事件、觸發(fā)事件、解除事件。 這就導(dǎo)致了一個循環(huán)引用的問題。 所以導(dǎo)致對象refcount一直不為0 一直回收不了。

接下來就好辦了。將查詢換成原始的連接試試。果然,內(nèi)存上升的非常慢了,可以說這才是正?,F(xiàn)象?,F(xiàn)在的內(nèi)存也就是50m左右,cpu也穩(wěn)定在7%左右。

代碼優(yōu)化后,再跑腳本,1分鐘左右吧,腳本就跑完了。重點是不會再報出內(nèi)存錯誤了。所以,以后考慮問題還是要深入。敢于質(zhì)疑。以后如果遇到這種內(nèi)存錯誤,一定要先檢查自己的代碼是不是有內(nèi)存泄漏的地方。不要想著先設(shè)置php的內(nèi)存。這樣只會治標(biāo)不治本。

總結(jié)

1、從開發(fā)速度方面,借助于gii腳手架,可以快速生成代碼,也就是說搭建一個可以增刪改查的系統(tǒng)可能一行代碼都不用寫,而且集成了jquery和bootstrap,特效和樣式基本也不需要寫了,這對于設(shè)計和審美能力普遍較差的后端程序員來說簡直是一大福利。不過在前后端完全的分離的趨勢下,Yii2前后端的耦合的還是有些重了。

2、從代碼的可讀性方面,Yii不會為了刻板地遵照某種設(shè)計模式而對代碼進行過度的設(shè)計?;旧项愒贗DE里不借助第三方組件是可以跳轉(zhuǎn)閱讀源碼的。這點上Yii要比Laravel略勝一籌。

3、從開源生態(tài)圈方面,Yii因為人少,稍微偏門一點的資料就很少,需要強大的谷歌能力和閱讀英文文檔的能力。

不可否認(rèn),Yii是一個優(yōu)秀的開發(fā)框架,值得PHP開發(fā)者上手學(xué)習(xí),踩坑的過程也是一種成長與積累。最后祝愿PHP小伙伴們都健健康康,事業(yè)有成。

您可能感興趣的文章:
  • 從零開始學(xué)YII2框架(一)通過Composer安裝Yii2框架
  • 從零開始學(xué)YII2框架(五)快速生成代碼工具 Gii 的使用
  • 從零開始學(xué)YII2框架(六)高級應(yīng)用程序模板
  • 從零開始學(xué)YII2框架(三)擴展插件yii2-gird
  • 從零開始學(xué)YII2框架(二)通過 Composer 安裝擴展插件
  • 從零開始學(xué)YII2框架(四)擴展插件yii2-kartikgii

標(biāo)簽:銅川 南陽 宜賓 黃南 婁底 寶雞 湛江 鎮(zhèn)江

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Yii2框架中一些折磨人的坑》,本文關(guān)鍵詞  Yii2,框架,中,一些,折磨,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Yii2框架中一些折磨人的坑》相關(guān)的同類信息!
  • 本頁收集關(guān)于Yii2框架中一些折磨人的坑的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    中文字幕一区二区三区四区五区| 欧美日日夜夜| 福利在线免费| 国产又粗又猛又色又| 国产精品.com| 欧美精品第三页| 欧美精品一区二区三区涩爱蜜| 国产又粗又硬视频| 亚洲精品第一国产综合野草社区| 中文字幕在线永久在线视频2020| 日本免费在线视频不卡一不卡二| 日韩av电影在线观看| 国产成人三级| 一区二区的视频| 免费看一级大片| 美女视频亚洲色图| 欧美一区二粉嫩精品国产一线天| 欧美aaa在线观看| 国产精品久久久久久久久晋中| 久久在线精品视频| 欧美风情在线视频| 亚洲欧美日韩第一页| 欧美tk丨vk视频| 97影院秋霞午夜在线观看| 国内久久视频| 久久国产精品偷| 中文字幕在线直播| 国产九九在线观看| 成人亚洲欧美激情在线电影| 国产成人精品亚洲线观看| 久久精品国产亚洲精品| 在线的色视频| 国产欧美在线观看免费| 99精品国产一区二区三区2021| 一道精品视频一区二区三区男同| 少女频道在线观看免费播放电视剧| 天堂在线免费观看视频| 欧美激情一区二区三区蜜桃视频| 热久久视久久精品18亚洲精品| 超碰av在线免费观看| 中文字幕亚洲无线码a| 极品粉嫩小仙女高潮喷水久久| 国产精品白浆流出视频| 视频在线一区二区三区| 美国av免费观看| 91老司机福利在线| 日韩精品一区二区在线播放| 欧美成人高潮一二区在线看| 欧美孕妇孕交黑巨大网站| 91se在线观看| 超碰在线超碰在线| 成人黄色在线观看| 动漫精品一区二区三区| 九九视频精品免费| 日韩一级片大全| 一级欧美一级日韩片| 国产在线69| 亚洲第一视频在线| 欧美日本韩国一区二区| 久久最新网址| 一个人看的www一区| 美女做暖暖视频免费在线观看全部网址91| 91精品国产自产在线| 日韩在线观看一区二区| 国内精品写真在线观看| 国产精品一二二区| 一区二区欧美在线观看| 国产字幕在线观看| xxxxxxxxx欧美| 欧美激情a∨在线视频播放| 亚洲国产av一区二区三区| 91久久国产精品91久久性色| 在线a免费观看| 欧美自拍大量在线观看| 色婷五月综激情亚洲综合| 亚洲网站视频| 九九热这里只有精品6| 国产日韩av一区二区| 国产精品入口夜色视频大尺度| caoporn国产精品| 午夜精品一区二区三区国产| 亚洲三级欧美| 国产一区二区精品在线观看| 亚洲黄色片免费看| 日本在线www| 深夜福利国产精品| 精品免费久久久久久久| 欧美日韩在线视频一区二区| 麻豆一区在线观看| 中文字幕精品久久久久| 国产黄色特级片| 好吊色视频988gao在线观看| 亚洲第一页在线观看| 大胸美女被爆操| 午夜伦欧美伦电影理论片| 538视频在线| 亚洲a在线视频| 国产精品久久久久久久av电影| 欧美gay男男猛男无套| 欧美日韩中字一区| 欧美激情久久久久久| 啊v视频在线一区二区三区| 天堂√中文在线| 91精品国产自产| 春意影院午夜免费入口| 久久九九电影| 伊人久久大香线蕉精品组织观看| 国产三线在线| 欧美中文字幕亚洲一区二区va在线| 91成人福利在线| 欧美黑人粗大| 日本一二区免费| 国产伦精品一区二区三区四区视频| 怡红院av一区二区三区| 国产三级欧美三级| 欧美专区福利在线| 黄色三级视屏| 日本成人看片网址| 成人免费视频视频在线观看免费| 国产成人免费在线观看视频| 天堂电影一区| 国产精品一站二站| 麻豆精品在线| 欧美三级中文字| 日韩成人精品视频| 亚洲最新av| 日韩精品午夜视频| 国产精品伦一区二区三区级视频频| 欧美午夜精品理论片a级大开眼界| 国产精久久久| 色婷婷综合久久久久中文字幕| 亚洲第一网站男人都懂| 久久久久久国产精品三级玉女聊斋| 激情av综合网| av日韩中文| 粉嫩一区二区三区性色av| 国产又猛又黄的视频| 欧美在线免费视屏| 久久99精品久久久久久青青日本| 久久午夜精品| 欧美精品一区二区三区高清aⅴ| 电影一区电影二区| 亚洲精品xxx| 99热这里只有精品9| 欧美激情极品视频| 亚洲美女少妇无套啪啪呻吟| 欧美成人手机视频| 久久婷婷久久一区二区三区| 99精品99久久久久久宅男| 精品国产乱码久久久久久1区2区| 欧美sm美女调教| 欧美xxx在线观看| 亚洲经典自拍| 亚洲午夜在线播放| 4438全国成人免费| 正在播放一区| 欧美日韩国产丝袜另类| 日韩av网站在线观看| 在线三级中文| 欧美疯狂party性派对| 一区二区三区在线观看网站| 男女日批视频在线观看| 深田咏美在线x99av| 少妇一区二区三区| 农村少妇久久久久久久| 一区二区三区激情视频| 风间由美一二三区av片| 欧美精品videos另类| 一级片免费观看视频| 91精品婷婷国产综合久久性色| 日韩一级免费片| 99久久综合国产精品| 九色免费视频| 丁香五六月婷婷久久激情| 久久精品久久国产| 欧美中日韩免费视频| 精品一区二区在线播放| 你懂的网址视频| 福利在线导航136| 丰满少妇高潮在线观看| 国产黄色片在线| 欧美激情亚洲另类| 91在线播放国产| 99精品国产99久久久久久97| 色婷婷国产精品| 经典三级一区二区| 欧美色图综合网| 91啪九色porn原创视频在线观看| 亚洲人成在线观看网站高清| 国产一区二区福利视频| 黄色一级片视频| 在线日韩日本国产亚洲| 国产精品毛片a∨一区二区三区| 亚洲三级视频在线观看| 欧美日韩一区二区三区在线看| 先锋影音欧美| 成人一级视频在线观看| 开心丁香婷婷深爱五月| 六十路在线观看| 成人在线高清免费| 长河落日免费高清观看| 一区二区三区av电影| 中文字幕无线码| 国产中文字幕日韩| 九九热精品免费视频| www插插插无码免费视频网站| 亚洲欧美日韩不卡一区二区三区| 久久久精品影视| 国精产品一区一区三区四川| 国产在线免费看| 国产激情视频一区二区三区欧美| 99久久免费国| 九九大香尹人视频免费| 日韩欧美xxxx| 少妇无码av无码专区在线观看| 日韩成人一区二区三区| 亚洲午夜激情| 区日韩二区欧美三区| 4438x成人网最大色成网站| 日韩伦理一区二区三区| www.欧美精品一二三区| 免费国偷自产拍精品视频| 91免费视频网站在线观看| 91精品国产综合久久精品图片| 极品av在线| 欧美孕妇孕交黑巨大网站| 在线观看的日韩av| 国产精品扒开腿做爽爽爽视频| 国产69精品久久久久毛片| 欧美jizz| 美日韩黄色片| 三级影片在线观看| 欧美日韩视频精品二区| h视频在线观看网站| 国产成人免费观看网站| japan高清日本乱xxxxx| 2020日本在线视频中文字幕| 久久免费视频2| 99综合精品久久| 在线激情视频| 日韩精品在线观看免费| 涩涩视频在线观看| japanese在线播放| 在线欧美一级视频| 国产在线无码精品| 亚洲特级片在线| 麻豆tv在线| 美女扒开尿口让男人操亚洲视频网站| 激情婷婷久久| 777奇米四色成人影色区| 成人性生交大片免费网站| 国产免费观看久久| 久久久久久国产免费| 一级特黄录像免费播放全99| 欧美精品日韩在线| 综合区小说区图片区在线一区| 激情图区综合网| 成人免费图片免费观看| 亚洲精品你懂的| 国产中文字幕免费观看| 五月婷婷激情综合网| 国产xxxxxx久色视频在| 91麻豆精品国产91久久久资源速度| 日本视频不卡| 老司机免费视频一区二区| 欧美日韩性视频在线| 国产99亚洲| 欧洲精品亚洲精品| 欧美一区二区视频在线观看2020| 初高中福利视频网站| 欧美色倩网站大全免费| 亚洲天堂中文在线| 日本一区免费看| 亚洲国产成人av好男人在线观看| 欧美亚洲黄色片| 国产精伦一区二区三区| 夜夜嗨av一区二区三区网页| 91天堂在线| 特黄aaaaaaaaa真人毛片| 欧美人狂配大交3d怪物一区| 成人免费网址| 在线看的av| 国产精品视频99| 日韩三级视频在线看| 欧美边添边摸边做边爱免费| 亚洲国产裸拍裸体视频在线观看乱了| 午夜剧场免费看| 99a精品视频在线观看| av网站一区二区三区| 日本黄色片在线观看| 日韩一区二区免费高清| 3d性欧美动漫精品xxxx软件| 亚洲av毛片在线观看| 亚洲婷婷伊人| 国产成人精品综合| eeuss影院在线播放| 97碰碰视频| 可以在线看的av| 狠狠色综合色区| 精品一区二区三区在线观看国产| 日韩免费在线观看视频| 午夜xxxxx| 麻豆视频久久| 亚洲欧美在线网| 蜜桃视频成人在线观看| 69久久夜色精品国产69蝌蚪网| 国模私拍一区二区三区| 欧美亚洲精品在线观看| 91精品蜜臀在线一区尤物| 亚洲一区二区四区蜜桃| 91成人福利在线观看| 岛国片在线免费观看| 国产喷水在线观看| 五十路在线观看| 伊人久久高清| 色哟哟免费视频| 99一区二区| 日韩在线一区视频| 先锋影院av| 999在线免费观看视频| 三级在线看中文字幕完整版| 亚洲男女网站| 国产在线一区二| 国产福利一区二区三区在线视频| 欧美日韩人妻精品一区二区三区| 欧美成人免费看| 三上悠亚作品在线观看| 九色视频入口|