私は外部モジュール拡張機能を作成しましたが、PHP ソース コード内の mysql 拡張機能を調べ始めています。これは PHP に統合できるため、組み込み拡張機能と見なす必要があります。
この拡張機能は、mysql データベースによって提供されるいくつかのインターフェイスを使用する必要があるため、mysql をインストールし、mysql.h の場所を決定する必要があります。
この拡張機能の場所は通常、PHP-source-code/ext/mysql の下にあります。
Linux では、注意が必要な主なファイルは config.m4、php_mysql.c、php_mysql_structs.h です。
ps: このディレクトリにはタグ ファイルがあるため、ctags のさまざまな機能を使用して関数やマクロ定義などを直接検索できます。
追記: Linux sudo mysql-dir/bin/mysqld_safe &
で mysql を起動すると、2 つのプロセスが実行されます:
コードをコピーコードは次のとおりです:
root 5297 0.0 0.0 5920 1416 pts/5 S 11:08 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe
mysql 5320 1.4 1.1 202728 23796 ポイント/5 Sl 11:08 1:47 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --user= mysql -- pid-file=/usr/local/mysql/var/tj1clnxweb0004.pid --skip-external-locking --port=3306 --socket=/tmp/mysql.sock
コードをコピーします コードは次のとおりです:
$sql = sprintf ("select * from pet;");
$result = mysql_unbuffered_query($sql, $conn);
$rows = mysql_fetch_row($result);行);
$ sql = sprintf("ショップから * を選択");
$rows = mysql_fetch_row($result); ($rows);
実行の結果、2 回目のフェッチでは最初の結果は表示されませんが、PHP は次の通知を報告します。
PHP 通知: mysql_unbuffered_query(): 前のバッファリングされていないクエリから最初にすべての行をフェッチせずに関数が呼び出されました。 /home/yicheng/test-all/mysqltest/test.php 28 行目
テスト コードを変更します:
コードをコピーします コードは次のとおりです
$i = 1000000;
while($i--){
$sql = sprintf("select * from pet;"); mysql_query($sql, $conn);
#$result = mysql_unbuffered_query($sql, $conn);
while($rows = mysql_fetch_row($result)){
}
if ($result) {
mysql_free_result($result);
}
}
コードをコピーします コードは次のとおりです。
#define ZEND_VERIFY_RESOURCE(rsrc)
if (!rsrc) {
RETURN_FALSE;
}
#define ZEND_FETCH_RESOURCE( rsrc、rsrc_type、passed_id、default_id、resource_type_name、resource_type)
rsrc = (rsrc_type) zend_fetch_resource(passed_id TSRMLS_CC、default_id、resource_type_name、NULL、1、resource_type);
ZEND_VERIFY_RESOURCE(rsrc); OURCE2 (rsrc、rsrc_type、passed_id、default_id、resource_type_name、resource_type1、resource_type2)
rsrc = (rsrc_type) zend_fetch_resource(passed_id TSRMLS_CC、default_id、resource_type_name、NULL、2、resource_type1、resource_type2);
ZEND_VERIFY_RESOURCE(rsrc);
#define ZEND_REGISTER_RESOURCE(rsrc_result, rsrc_pointer, rsrc_type)
zend_register_resource(rsrc_result, rsrc_pointer, rsrc_type);
#define ZEND_GET_RESOURCE_TYPE_ID(le_id, le_type_name)
if (le_id == 0) ) {
le_id = zend_fetch_list_dtor_id(le_type_name);
}
mysql_connect 関数から返されるものは、実際にはマッピング可能なリンク ID (タイプ (mysql link) の resource(4)) です。 ZEND_FETCH_RESOURCE および ZEND_FETCH_RESOURCE2 マクロを通じて、対応する mysql リソースにアクセスします。どちらのマクロも zend_fetch_resource メソッドを呼び出しますので、このメソッドを見てみましょう。
コードをコピー コードは次のとおりです:
error_reporting(E_ALL); #var_dump(mysql_get_host_info($conn));#var_dump(mysql_get_proto_info($conn));
#var_dump(mysql_stat($conn)); 🎜># var_dump(mysql_errno($conn));
#var_dump(mysql_error($conn));
--- ---------------------------------------------------
MYSQL ソース コードのいくつかの便利な構造体
typedef struct st_mysql
{
NET net; /* 通信パラメータ */
gptr Connector_fd; /* ConnectorFd for SSL */
char *host,*user,*passwd,*unix_socket,*server_version,*host_info,*info;
char *db;
struct charset_info_st *charset;
MYSQL_FIELD *フィールド;
MEM_ROOT フィールド_alloc;
my_ulonglongaffected_rows;
my_ulonglong insert_id; /* NEXTNR を使用してテーブルに挿入する場合の ID */
my_ulonglong extra_info; /* 使用されません */
unsigned long thread_id; /* サーバーの接続用の ID */
unsigned long packet_length;
符号なし int ポート;
unsigned long client_flag,server_capabilities;
unsigned int プロトコルバージョン;
unsigned int field_count;
unsigned int server_status;
unsigned int サーバー言語;
unsigned int warning_count;
struct st_mysql_options オプション;
列挙型 mysql_status ステータス;
my_bool free_me; /* mysql_close で空いている場合 */
my_bool 再接続; /* 自動再接続の場合は 1 に設定 */
/* セッション全体のランダムな文字列 */
char scramble[SCRAMBLE_LENGTH 1];
/*
これが元の接続であり、
mysql_rpl_probe() または mysql_set_master()/ mysql_add_slave() によって追加したマスターまたはスレーブではない場合に設定します
*/
my_bool rpl_pivot ;
/*
マスターへのポインタ、および次のスレーブ接続は、単独の接続の場合は
それ自体を指します。
*/
struct st_mysql* マスター、*next_slave;
struct st_mysql* last_used_slave; /* ラウンドロビンのスレーブ選択に必要 */
/* レプリケーションで正しく動作するために結果の送信/読み取り/保存/使用に必要 */
struct st_mysql* last_used_con;
LIST *stmts; /* すべてのステートメントのリスト */
const struct st_mysql_methods *methods;
void *thd;
/*
MYSQL_RES または MYSQL_STMT のブール型フラグを指します。 close がこのオブジェクトの結果セットをキャンセルする必要がある場合は、mysql_stmt_close からこのフラグを
に設定します。
*/
my_bool *unbuffered_fetch_owner;
#定義されている場合(EMBEDDED_LIBRARY) ||定義済み(EMBEDDED_LIBRARY_COMPATIBLE) || MYSQL_VERSION_ID >= 50100
/* 組み込みサーバーに必要 - 「情報」を保存するためのネット バッファーがありません */
char *info_buffer;
#endif
} MYSQL;
typedef struct st_mysql_methods
{
my_bool (*read_query_result)(MYSQL *mysql);
my_bool (*advanced_command)(MYSQL *mysql,
enum enum_server_command コマンド,
const char *header,
unsigned long header_length,
const char *arg,
unsigned long arg_length,
my_bool Skip_check、
MYSQL_STMT *stmt);
MYSQL_DATA *(*read_rows)(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
unsigned int フィールド);
MYSQL_RES * (*use_result)(MYSQL *mysql);
void (*fetch_lengths)(unsigned long *to,
MYSQL_ROW カラム, unsigned int field_count);
void (*flush_use_result)(MYSQL *mysql);
#if !define(MYSQL_SERVER) ||定義済み(EMBEDDED_LIBRARY)
MYSQL_FIELD * (*list_fields)(MYSQL *mysql);
my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt);
int (*stmt_execute)(MYSQL_STMT *stmt);
int (*read_binary_rows)(MYSQL_STMT *stmt);
int (*unbuffered_fetch)(MYSQL *mysql, char **row);
void (*free_embedded_thd)(MYSQL *mysql);
const char *(*read_statistics)(MYSQL *mysql);
my_bool (*next_result)(MYSQL *mysql);
int (*read_change_user_result)(MYSQL *mysql, char *buff, const char *passwd);
int (*read_rows_from_cursor)(MYSQL_STMT *stmt);
#endif
} MYSQL_METHODS;