そのポイントのゴシップ
一年前、すでに最後のブログ、以来。前に常に罪悪感の深い意味と、それを書きます。それは長い時間、最終的には、まだ、手のための拷問でした。
一つのことを祝うために:最近、私はジムを始めました。スポーティなバイク45分日、45分を泳ぐは本当に(など)への(生)クール(ない)バースト(死んだ)です。
まあ、ナンセンスが完了すると、質問に来ます。
ActiveRecordのは不可解書かれていますか?
レディ知識
ActiveRecord
基本的な使い方。理解されていない場合は、参照してここに。
Codeサイト
/ * * * @Property ID整数$ * $ @Property文字列名 *詳細@Property文字列$ * $ダブル@Property価格。 * $エリア@Property整数 * * / クラス OcRoom 拡張ActivieRecord { ... } $ルーム = OcRoom: :検索() // 最初のオブジェクトを削除します。 - >([ 'ID'])を選択 // 唯一の'ID'列を削除 - > WHERE([ 'ID' => 20である]) - > ワン(); $ルーム - >保存(); // 保存され、この行で見つける他のフィールドはデフォルト値で書かれています。
問題の概要
この例の問題は、次のとおりです。
- 私は、コードされた行のデータベースから削除さ
$room
が、唯一のうちid
フィールド、および他のフィールドの性質がデフォルトです。 - 私の場合は
$room->save()
、デフォルトのフィールド値をだ時には、また行ってデータベースに保存することができます。何!? - つまり、あなたがリソースを節約したい場合、すべてのフィールドを削除しないでくださいそれ以外の場合は、保存しないように注意する必要があり、データの多くは、デフォルト値を変更するために不可解になります。
ソリューション
しかし、我々はすべてのソリューションを持っていますか?これは、いくつかのアイデアを提供しています:
- 自分自身に常に注意を払う、回避は完全に削除されません
ActiveRecord
保存すること。 - 継承や変更
ActiveRecord
、そのためには、オブジェクトときfind()
、そして新しいフィールドが完全に除去されていない、呼び出すsave()
方法と、例外がスローされます。 - 継承や変更
ActiveRecord
、そうオブジェクトとき、ことfind()
、そして新しいフィールドが完全に除去されていない、通話save()
時間法は、フィールドのみを引き継いを保存し、他のフィールドは無視されます。
あなたのトランザクションは、まだ発効しましたか?
Codeサイト
/ * * * $ id整数@property * @property列$名 * * / クラス OcRoomは延びActiveRecordの { パブリック 関数のルール() { 戻り '最大'、[[ '名前'、 '文字列'、 '分' => 2 => 10 ]。 } ... } クラス OcHouseは延びActiveRecordの { パブリック 関数のルール() { 戻り [[ '名前'、 '文字列'、 '最大' => 10 ]。 } ... } $ = 新しいOcRoom(); $ A- >名前=「」; // 名前は空の文字列で、ルール()の条件を満たしていません。 B $ = 新しい新OcHouse(); $ B - >名= '私の部屋'; // 名前は合法的に、保存することができます。 トランザクション$ =のYii :: $アプリケーション - > DB-> のbeginTransaction(); 試み{ $ A - >保存()は; // nameフィールドは正当ではない、ことによって確認することができない、返された偽の検証で()の位相を持って、ではありませんそれが例外をスローしないように、データベースには、ストアドプロシージャを。 B $ - >保存(); // 名前フィールド合法的、適切に保存することができます。 トランザクション$ - >コミット(); // 提出した後$保存できなかった、と$ bが正常に保存されました。 } キャッチ(例外 $ E ) { のYii ::エラー($ E - > getTraceAsString()、__METHOD__ )。 $取引 - > ROLLBACK(); }
問題の概要
このコードの問題は、次のとおりです。
- ことを私たちは皆知っている
$transaction
「全体の存在意義Sは、データベースに格納されたコードは、どちらかのすべての成功、または3つすべてが失敗することを確実にするためです。 - もちろん、この場合には、
transaction
:私たちは、私たちが望む結果を達成していなかった$a
ため、validate()
これまでにない、そう$transation->commit()
時間は文句はありません。
ソリューション
では$transation
ブロック、すべてのsave()
戻り値は、それがある場合は、決定しなければならないfalse
、直接例外をスロー。
'YM-d' は認識されませんか?
Codeサイト
OcRenterBill 延びActiveRecordの { パブリック 関数をルール() { 戻り[ [ 'START_TIME'、 'DATE'、 'フォーマット' => 'の-D Ymの'] ]; } } $ A = 新たな新しいOcRenterBill(); $ A =」2015年-09-12 " ; $ A - >保存(); //は間違った形式と文句を言うだろう
問題の概要
最初の場合は、エラーのYiiのフレームワークは、これはあまりにもピットではありません。Mac上で私の開発時間のピットは、この作品は完全に正常であることができますが、オンライン環境(Ubuntuの)のリリース後、ポップアップエラー「のstart_time属性の形式が無効です」。そして、公式ドキュメントを参照してください、私たちは、このフォーマットができるようにすることです見つかった公式文書を。
ああああああ。試行錯誤のすべての種類は、最後に変更された場合ことを発見しphp:Y-m-d
、世界はきれいです。この問題が発生したのであれば、私はそれを感謝しています。
メモリリーク
Codeサイト
パブリック 静的 関数actionTest(){ $合計 = 10 。 var_dump( '开始内存'。memory_get_usage()); 一方、($合計){ $ RET =ユーザー:: findOne([ 'ID' => 910002 ])。 var_dump( '末端内存'。memory_get_usage()); 設定を解除($ RET )。 $合計 - 。 } }
コード上のメモリは、それはメモリが成長されていても増加しない、ビューのオリジナルのアイデアによると、変数が解放され、成長してきました。ループメモリを介して各時間がリリースされますので。
データベースの操作に関連する問題の分析上記のコード、そして我々は、データベースの多くの部分でメモリリークを引き起こす可能性があることを知っています。第一シールドデータベース関連の操作、私の手書きデータベースのクエリ操作ネイティブはそう、メモリが正常であることは問題を発見しました。
$ DSN = "mysqlの:DBNAME =テスト;ホスト= localhost"を。 $ DB_USER = 'ルート' 。 $ DB_PASS = '管理者' 。 // 查询 $ SQL = "SELECT * FROM買い手" 。 $ RES = $ PDO - >クエリ($ SQL )。 foreachの($ RES として $行){ エコー $行 [ 'ユーザ名'] '<BR/>' ; }
この時間は、答えは---幽霊に従事するyii2枠組みはほぼ確実です
我々はそれが問題yii2フレームワークである知っているので、問題を配置すると、問題をさらに絞り込むことができます。
パブリック 静的 関数actionTest(){ $合計 = 10 。 var_dump( '开始内存'。memory_get_usage()); 一方、($合計){ $ RET = 新しいユーザー(); var_dump( '末端内存'。memory_get_usage()); 設定を解除($ RET )。 $合計 - 。 } }
メモリはまだ増え続けています。私はyii2検索メモリの一つの他のクラスをテストした。この時間が増加することはありません。これは、独自の内部のタイムyii2に新しいオブジェクトに関連付けることができるものをしたし、その後、メモリリークが発生します。それが実行され、新たな方法は何ですか。。。__constructのコンストラクタ。それから私は、ステップバイステップのオブジェクトがモデルからの漏れを引き起こす可能性がない場所を見つけることが見つかりません。
今回は何yii2ユニークな機能ですが、また新たなターゲットにするときにそれを実行されます、それはリークがyii2枠組みの下で発生しているので、それは確かにyii2ユニークな機能である、思考に変更される可能性がありますか?
行動(行動)は私のモデルクラスは本当に便利な振る舞いを見つけました
パブリック 関数の挙動() { リターン[ TimestampBehavior :: クラス、 ]。 }
しかし、最も一般的なコード。最後の呼び出しの動作は基本\コンポーネント - \ Yiiのです我々はattachBehaviorsは最終的に見つける>知っています
プライベート 機能 attachBehaviorInternal($名、$行動) { 場合((!$行動行動のinstanceof)){ $行動 =のYii :: CREATEOBJECT($振る舞い)。 } であれば(is_int($名)){ $行動 - >(アタッチ$この)。 これを$ - > _振る舞い[] = $行動を、 } 他{ 場合(ISSET($この - > _行動[$名])){ $この - > _挙動[ $名 ] - > デタッチ(); } $挙動は - >(添付$この)。 これを$ - > _振る舞い[ $名 ] = $行動。 } を返す $行動を、 }
我々は($ this)を添付>彼は自身が$ behavior-に渡さ見つけ、このコードを遵守し、最後の呼び出しは、Yiiの\ベース\ Behavior-です>添付します
パブリック 関数は、(添付$所有者) { $この - >所有者= $所有者を、 foreachの($この - >イベント()として $イベント => $ハンドラ){ $所有者 - >に($イベント、IS_STRING($ハンドラ)[?$この、$ハンドラ ]:$ハンドラ)。 } }
問題の概要
答えは、この機能を実現するために、Yii2の挙動はかなり明確になっているこの時間は、イベント、トリガイベント、イベントのリフティングを登録することができるようにするために、このパス自体を置きます。循環参照の問題にこのリード。回収されていないオブジェクトの参照カウントが得られことはゼロではありません。
そして、扱いやすいです。元の接続の試行にお問い合わせ。案の定は、メモリの上昇が非常に遅く、これは正常な現象であると言うことができます。今メモリは約7%で50メートル、CPUも安定についてです。
コードは、別のスクリプトを実行するように最適化された後、それを1分程度、スクリプトが駆け寄ります。焦点は、もはや報告されたメモリ・エラーではありません。だから、後にまだ深さの問題を検討する必要があります。質問する勇気。あなたは、この後にメモリエラーが発生した場合は、お近くのコードはメモリリークではありません確認してください。セットPHPのメモリに考えてはいけません。これは姑息ます。
概要
あなたは、コードの行を記述することなく可能CRUDシステムを構築し、jQueryとブートストラップを統合し、エフェクト、および基本的なスタイルを記述する必要はありませんことを1、開発速度から、足場GIIによって、あなたはすぐにコードを生成することができますが、手段、これは本当にデザインのための大きな利点であると審美的な能力は、一般的に貧しいバックエンドプログラマです。しかし、傾向の後端が完全に前方連結Yii2の前後端部又は一部重いを分離します。
図2は、コードの読みやすさから、Yiiは堅く設計パターンとオーバーデザインコードに従うことはありません。基本的には、ソースコードを読むためにジャンプすることができ、サードパーティ製のコンポーネントの助けを借りずにIDEでクラス。YiiのLaravelこの点についてよりもわずかに良いです。
図3は、オープンソースのエコシステムの観点から、Yiiは数人いるので、小さなサイドドア上の情報の少しは、Googleが強力な能力と英語の文書を読み取る能力を必要とします。
確かに、Yiiのは、優れた開発フレームワークである、プロセスはまた、ピットの成長と蓄積の段階で、始めるための学習PHP開発者の価値があります。最後に、私はPHPの小さな友人は完全に健康、成功したキャリアですたいです。