問題タブ [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 - PHP 拡張機能から実行中のスクリプトの名前を取得する
私はPHP用の小さな拡張機能を書いています。実行時に、実行中のスクリプト ファイルの名前 (例: test.php
) を知る方法はありますか? たぶん、いくつかのグローバル変数または環境変数ですか?
php - 同じプロパティで __get と __set の再帰制限をオーバーライドする
同じプロパティの再帰制限__get
をオーバーライドする方法はありますか。__set
最初のエントリとは異なる方法で 2 回目の再エントリを処理できるようにしたいと考えています。
このコード例は実用的ではありませんが、最も簡単に説明できます。
インターネットがダウンしているため、携帯電話で入力しているため、タイプミスが発生する可能性があります。
php - PHPクラスメソッドで最後の配列パラメータをオプションにする (C)
SPI インターフェイスにアクセスするために、C で PHP 拡張機能を作成しています。これまでのところ、ほとんどすべてが機能しています: Github の php_spi
ただし、コンストラクターの $options パラメーターをオプションにすることはできないようです。私の作業コードは次のようなものです:
ただし、すべてのドキュメントの提案に従うと、次のように l と a の間にパイプを見つけて追加できます。
その後、私の拡張機能は黙って失敗します - 誰かアドバイスをもらえますか?
c - PHPrand関数の変更
テストと学習の目的で、 https ://github.com/php/php-src :ext / standard/rand.cにあるphprand関数とmt_rand関数を変更したいと思いました。
rand関数が呼び出されるたびに固定出力を提供したかったので、この目的のためにコードを変更しました
編集済み
そして最後にrand関数をasecho rand(3000,4000);
と呼び、それは常に。を返します3000
。
この関数を変更する方法は何でしょうか?TSRMLS_D
範囲パラメータはあるがないのはなぜですか?
php - PHP 拡張機能をビルドして call_user_function を使用する
を介してmysqlデータベースに接続するための拡張機能を構築するためのコードを作成しますmysql_connect
。
私のコードはコンパイルされていますが、PHP で関数を使用したい場合、ループが発生し、おそらく動作しません。ここに私のC++コードがあります:
どんな体でも私を助けることができますか?
リソース接続を返したいだけです。
「retval」が myresource であることは知っていますが、このリソースを私の php コードに返す方法がわかりません。
php - get_memory_usageがメモリを保持するのはなぜですか?
コンピューターで次のPHPプログラムを実行した場合
出力を取得します
このことから、への最初の呼び出しmemory_get_usage
は32KBのメモリを保持しているように見えます。echo
私はステートメントなしでこれを試しました
同様の結果が得られました
ステートメントを削除するecho
と、スクリプトの全体的なメモリ使用量が削減されますが、への最初の呼び出し後も32KBが保持されmemory_get_usage
ます。どうしてこれなの?
複数のコンピューターでこれを試しましたが、実際の数は異なりますが、ギャップは同じままです。
私が(私が思うに)この関数のソースを見ると
そこには、必ずしも「この変数をメモリに保持する」と書かれているものは何もありません。しかし、私は何年も真剣にCを書いたことがなく、PHPソースを専門的にハッキングしたことはなく、実行を追跡する能力はまったくありません。
だから、私の質問は、その32KBのメモリを何が保持しているのか、そしてそれはPHPソースコードのどこで発生するのか、そして/またはmemory_get_usage
エントリポイントからそれをどのように追跡できるのかということです。
php - zend engineグローバルはプロセス間でメモリを共有していますか?
PHPのソースコードとmysql_pconnect関数を調べてみたところ、 zend_globalsHashTable persistent_list
で定義されている種類のものを使用していることに気付きました。
問題は、PHPがmod apache / fcgiとして設定されている場合、このグローバル変数と変数がリクエスト間でどのように保持されるかです。それがすべてのリクエストに対して生成された新しいPHPプロセスである場合、それらの変数は保持されるべきではありません。
php - PHPでオブジェクトが破棄される順序はどれですか?
オブジェクトの分解の正確な順序は何ですか?
テストから、私は考えを持っています:現在のスコープのFIFO。
これは何度も同じ結果を生成します:
PHPのマニュアルはあいまいです(不確実性を強調するために強調しています):「シャットダウンシーケンス中に特定のオブジェクトへの参照が他になくなるとすぐに、または任意の順序でデストラクタメソッドが呼び出されます。」
脱構築の正確な順序は何ですか?PHPが使用する破棄順序の実装について詳しく説明できますか?また、この順序がすべてのPHPバージョン間で一貫していない場合、どのPHPバージョンがこの順序で変更されるかを誰かが特定できますか?
php - PHP 5.4 用の C++ 拡張機能の作成、サンプル コードは廃止されました
基本的にCPPで非常に単純なクラスをラップするphp5.4の拡張機能を作成しようとしています。
これは教育目的のためです。
私はphp5.4でそれを行う方法がphp5.3から変更されていることを発見しました
その方法に関するドキュメントはどこにありますか? またはさらに良いのは、コード例、CPP クラスをラップし、php5.4 で動作する他の拡張機能です。
たとえば、以前は機能していた機能が機能しなくなった場合などです。http://devzone.zend.com/1435/wrapping-c-classes-in-a-php-extension/から取得
zend_hash_copy(obj->std.properties, &type->default_properties,
(copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *));
構造体インスタンスtype
(定義を忘れた) がメンバーを持たなくなったため、この行
は失敗します。default_properties
php - PHP 拡張機能の SEG 障害
静的ライブラリの関数にアクセスするための PHP 拡張機能を作成し、PHP を CGI としてビルドしましたが、すべてが機能しているように見えました (何日も作業した後..)
すべてがうまくいったことに興奮した私は、PHP に含まれていたメッセージをデバッグせずに PHP を再コンパイルしました。( php_printf("here111");
.... php_printf("sending arguments...");
)
その後、機能しなくなりました。静的ライブラリで呼び出している関数は機能します。別の実行可能ファイルから直接呼び出してテストしました。
デバッグ シンボル ( --enable-debug
) を使用して PHP をビルドし、gdb である程度デバッグできます。
私はまだ何が間違っているのかを理解するのに苦労しています。lib( diffFst
) 内の関数が入力引数を読み取れないようです。
この関数を呼び出すと、php_printf()
ステートメントが機能し、正しい値が出力されます。ただし、difffst_関数を呼び出させると、入力変数を読み取ろうとするとセグメンテーション違反が発生します。
diffFst 関数は fortran で書かれています。
具体的には、(デバッガによると) 122 行目で読み取りに失敗しますfilA
。
理由はわかりませんが、試しました:
- 関数をサブルーチンにする
- 関数を fortran 関数にする
- 関数を「純粋な」関数にする
- 戻り値を持つ (それが今あるものです
ier = ..
) return
コード内にステートメントがあり、return
ステートメントを削除する- 標準出力に出力してファイルをログに記録しようとしました
データが正しく渡されていないようです。デバッガでも引数が読めません。
イライラするのは、ある時点でこれが機能したことです.ファイルのアクセス許可、パスなどを確認しました.そして、Fortranラッパー実行可能ファイルから関数を正常に実行できます.
私が見逃しているトリックはありますか?
ありがとう