🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

467閲覧

PHP内部での処理がどうなっているか確認する方法

KazumiHirata

総合スコア20

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/11/26 06:35

PHP5.3.3のrename処理内部でどんな処理が行われているか確認したいのですが、どのように確認できるか教えていただけますでしょうか。

https://www.php.net/manual/ja/function.rename.php

やったこと

PHP 5.3.3 (tar.bz2) をダウンロードしてrenameで全文検索
https://www.php.net/releases/index.php

結果

下記のfile.cを発見しましたが、方針が合っているかさえ分かっていない状態。

filec

1PHP_FUNCTION(rename) 2{ 3 char *old_name, *new_name; 4 int old_name_len, new_name_len; 5 zval *zcontext = NULL; 6 php_stream_wrapper *wrapper; 7 php_stream_context *context; 8 9 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|r", &old_name, &old_name_len, &new_name, &new_name_len, &zcontext) == FAILURE) { 10 RETURN_FALSE; 11 } 12 13 wrapper = php_stream_locate_url_wrapper(old_name, NULL, 0 TSRMLS_CC); 14 15 if (!wrapper || !wrapper->wops) { 16 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate stream wrapper"); 17 RETURN_FALSE; 18 } 19 20 if (!wrapper->wops->rename) { 21 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s wrapper does not support renaming", wrapper->wops->label ? wrapper->wops->label : "Source"); 22 RETURN_FALSE; 23 } 24 25 if (wrapper != php_stream_locate_url_wrapper(new_name, NULL, 0 TSRMLS_CC)) { 26 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot rename a file across wrapper types"); 27 RETURN_FALSE; 28 } 29 30 context = php_stream_context_from_zval(zcontext, 0); 31 32 RETURN_BOOL(wrapper->wops->rename(wrapper, old_name, new_name, 0, context TSRMLS_CC)); 33}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/11/26 06:58

OSのファイルシステムに依存するものを追いかけるのでしょうか? 挙動だけ把握すればよいのでは? (ソースから追いかけるなら参照先まで再帰的にしらべてください)
maisumakun

2019/11/26 07:35

どのような経緯で、それを確認する必要が出てきたのでしょうか。
m.ts10806

2019/11/26 08:01

知ってどうしたいのかわかりません。新しい言語でも作りたいのでしょうか
KazumiHirata

2019/11/26 08:10

rename処理がAtomicな処理かどうかを知りたく、上記の質問をしました。
m.ts10806

2019/11/26 08:25

知って何をどうしたいのでしょうか
guest

回答2

0

ベストアンサー

rename処理がAtomicな処理かどうかを知りたく、上記の質問をしました。

結局はOSのシステムコールに流しますので、OSやデバイスによるという身も蓋もない結論しか得られないかと思います。

投稿2019/11/26 08:14

maisumakun

総合スコア145975

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KazumiHirata

2019/11/27 01:15

ご回答ありがとうございます。
guest

0

仕様も確認しながら見てみるといいかもしれませんね。
古いPHPだと、引数をC言語で扱えるように処理したらAPIに渡しているだけだったと思うのですがURLを受け付けるようにしたりとか複雑になったので少々面倒になっているのかな?

c

1 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|r", &old_name, &old_name_len, &new_name, &new_name_len, &zcontext) == FAILURE) { 2 RETURN_FALSE; 3 } 4

ここは引数を処理して、Cで扱えるようにしている、と言う感じで

c

1 wrapper = php_stream_locate_url_wrapper(old_name, NULL, 0 TSRMLS_CC);

これは、↑で書いたように「URLを受け付けるように」とか仕様が複雑になったのでラッパーを作成している部分でしょうね

c

1 if (!wrapper || !wrapper->wops) { 2 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate stream wrapper"); 3 RETURN_FALSE; 4 } 5 6 if (!wrapper->wops->rename) { 7 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s wrapper does not support renaming", wrapper->wops->label ? wrapper->wops->label : "Source"); 8 RETURN_FALSE; 9 } 10 11 if (wrapper != php_stream_locate_url_wrapper(new_name, NULL, 0 TSRMLS_CC)) { 12 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot rename a file across wrapper types"); 13 RETURN_FALSE; 14 }

ここは見ての通り、ラッパーを取得出来たか?(指定されたパスをサポートしているか?)、そのラッパーがrenameをサポートしているか?などを検査していて

c

1 context = php_stream_context_from_zval(zcontext, 0); 2 3 RETURN_BOOL(wrapper->wops->rename(wrapper, old_name, new_name, 0, context TSRMLS_CC));

(contextの実体がどういうものかはこの部分だけでは分かりませんが)wrapper->wops->rename()でrenameしているのでしょう。

という事で、php_stream_locate_url_wrapper()を調べてどのようなインスタンスが返されるかを理解した後に知りたい形式のラッパーのwrapper->wops->rename()を調べれば内部で何をしているのか?が分かるかと思います。

投稿2019/11/26 07:24

yoorwm

総合スコア1305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KazumiHirata

2019/11/27 01:15

ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問