問題タブ [php-internals]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - getimagesize() がキャッシュされた値を参照するようにする
CPU効率を高めるためにzen-cart Webサイトを微調整しています。プロファイリングした後、getimagesize 関数がページ読み込み時間の 50% 近くを占めていることがわかりました。画像はローカルに保存されます。1 つのオプションは、zen-cart のソース コードを調べて、この関数を何かカスタムに置き換えて、キャッシュされた値を参照することです。画像はめったに変更されないためです。ただし、php はオープン ソースであるため、おそらく別のオプションが利用可能です。画像をサーバーにアップロードするたびに設定できるキャッシュから値を読み取るように、この関数を変更する方法はありますか? おそらく、関数にオプションのパラメーターを追加して、キャッシュから読み取らせます。
delphi - zend (多次元配列) とのデータの交換
PHP4Delphi コンポーネントを使用して php5ts.dll とのインターフェイスを使用して、アプリ (Delphi 2010 で記述) に PHP を埋め込んでいます。PHPスクリプトで使用できるいくつかの関数と定数を登録するため、私のプログラムはPHP(sapiモジュール?)の拡張機能として機能すると思います...とにかく、単純なデータ型を使用する場合はうまく機能しますが、多次元配列を使用しようとすると戻り値としてエラーが発生します
Access violation at address 01CD3C35 in module 'php5ts.dll'. Read of address 0231E608.
スタックリスト
(000A2C35){php5ts.dll} [01CD3C35] destroy_op_array + $35
(004C4D61){myApp.exe } [008C5D61] php4delphi.TPHPEngine.ShutdownEngine (Line 1497, "php4delphi.pas" + 17) + $7
php4delphi.pas の 1497 行が呼び出されます。tsrm_shutdown();
私には、スクリプトの最後でガベージコレクターがクラッシュしているように見えるので、エンジンにデータを正しく送り返していないのではないかと疑っています...したがって、多次元配列をPHPに送り返す方法が私の質問ですか?
私が使っているパターンは
作成したサブアレイをどこかに「登録」する必要がありますか? 増減refcount
または設定する必要がありis_ref
ますか? IOW、サブ配列の return_value と zvals をどのように設定する必要がありますか?
各配列のrefcountに1を追加して実験しました(MAKE_STD_ZVALはすでにrefcountを1に初期化していますが)、これでAVは解決しますが、スクリプトを実行するとアプリが消えることがあります-エンジンのメモリマネージャーで無限再帰が発生し、php DLLがクラッシュし、アプリを持っていく... refcountを0に設定すると(ゼロ; PHPスクリプトで戻り値が割り当てられたときにrefcountが1になり、PHP変数がスコープ外になると破棄されると仮定すると)すべてのようです動作します(つまり、クラッシュもAVもありません)が、スクリプトは出力を生成せず、空のhtmlファイルのみを生成します...
また、データを配列として関数に送信し、zend_hash_find
, zend_hash_get_current_data
etc を使用してデータを読み取ります。これにより、変数の参照カウントが台無しになる可能性はありますか? つまり、使い終わったときに返される変数のrefoutを減らす必要がありますzend_hash_find
か?
また、配列を反復処理するときに同じ変数を再利用しても安全ですか。つまり、
または、ループの各反復で Val を作成/解放する必要がありますか?
ティア
・アイン
php - PHPのMySQLカーソルの実装とそれらがメモリを管理する方法
PHP内のさまざまなMySQLカーソルはどのようにメモリを管理しますか?つまり、大きな結果セットを取得するMySQLクエリを作成し、MySQLリソースを取得すると、クエリが取得したデータのどれだけがローカルメモリに保存され、さらに多くの結果がどのように取得されますか?カーソルはすべての結果を自動的にフェッチし、リソースを反復処理するときにそれらを提供しますfetch_array
か、それともバッファリングされたシステムですか?
最後に、mysql内のさまざまなドライバーのカーソルは異なる方法で実装されていますか?PHP用のMySQLドライバーがいくつかあります。 mysql
、、、など。それらはすべて同じ方法に従いますか?mysqli
pdo
php - PHP MongoDB ドライバーのカーソルはどのように結果セットをバッファリングしますか?
mongodb に対してクエリが実行されると、カーソルはメモリ内の結果セットをどのように処理しますか? カーソルは、クエリに一致するすべてのドキュメントを一度に取得しますか? または、一度に 1 つのドキュメントを取得しますか? またはそれらはバッファリングされていますか?または、私が知らない別の解決策がありますか?
バッファリングされたソリューションの場合、サーバー/クライアントにどのように保存されますか? クライアントがローカルに保持するデータの量は?
php - PHP はどのように変数にメモリを割り当て、解放しますか?
PHPが変数に使用されているメモリをいつ解放するのか疑問に思っていました
例えば
それはより遅いですか:
?
php - PHP はどのようにすべての適合するコンテナー「配列」を実装しますか?
もしそうならc++
、これはテンプレートによって達成できますが、私たちが知ってPHP
いるようにc
、この種のデータ構造体はテンプレートなしでどのように実装されていますか?
php - PHP配列構文/演算子?
PHPで連想配列の構文を書くときは、次のようにします。
=>
構文、またはおそらく演算子の関係に興味があります。これは、ZEのハッシュテーブルで使用されるある種の参照、またはで使用されるある種の後続の右シフトまたは参照に関連していC
ますか?この構文の真の根本的な目的、配列の処理に使用されるZEやphp拡張機能との関係、C
コンパイル前に記述された関数との関係、または私が何を理解していないのか、疑問に思っていると思います。について話している:)
php - 関数呼び出し結果のセマンティクスを変更する括弧
別の質問で、PHP 関数呼び出しの結果を括弧で囲むと、次のように結果を本格的な式に変換できることが指摘されました。
ここで何が起こっているのかを明確かつ明確に説明するために、ドキュメントで何かを見つけようとしています。C++ とは異なり、私は PHP の文法とそのステートメント/式の扱いについて、自分で派生させるのに十分な知識がありません。
この動作に関するドキュメントに隠されているものはありますか? そうでない場合、他の誰かが推測に頼らずに説明できますか?
アップデート
私は最初、この EBNFが PHP の文法を表していると主張していることに気づき、スクリプトを自分でデコードしようとしましたが、結局あきらめました。
次に、を使用phc
して 2 つのバリアントの.dot
ファイルを生成し、次のコマンドを使用して両方のスクリプトの AST イメージを生成しました。foo()
どちらの場合も、結果はまったく同じでした。
php - 不可解なphpパーサーエラー
それほど不可解ではないかもしれませんが、ここにあります。
私はいじり回していて、これに気付き<?php
ました。ファイルに入力するだけで、その後にスペースがなく、タグだけで、解析エラーがスローされます。
単一のスペースで問題なく動作します。それ以外の場合は終了タグを省略してもまったく問題ないため、パーサーがチョークする理由を誰かが知っているかどうか疑問に思っていました。ありがとう。
php - PHP Zend Engine 拡張機能の静的メソッド呼び出し
私はPHP拡張機能を書いています。C コードから、PHP コードで静的メソッドを呼び出そうとします。
PHP メソッドは次のようになります。
C での呼び出しは次のようになります。
...渡されたすべてのパラメーターには適切な値が含まれている必要があります。ここで奇妙なのは、拡張機能を php 5.2 に対してコンパイルすると、コードは正常に動作しますが、これを php 5.3 に対してコンパイルすると、メソッド呼び出しがエラー メッセージなしで失敗することです。
zend_call_method
どちらのバージョンでも成功しませんでした。
誰でも私にヒントを与えることができますか?C から静的メソッドを呼び出すにはどうすればよいでしょうか?
前もって感謝します!
編集
申し訳ありませんが、私はそれをzend_call_method
次のように機能させました:
...だから私は学びました:
- 関数名は常に小文字にする必要があります
- 文字列の長さに関しては、PHP のソース コードを確認することをお勧めします (
zend_call_method
内部で +1 が追加されます)。
私は C は初めてですが、PHP コード ベースは多くの点で複雑すぎると思います。
これが他の誰かに役立つことを願っています!