PHP 面接の質問の共有

WBOY
WBOYオリジナル
2016-07-30 13:31:111767ブラウズ

1. nginx はどのネットワーク プロトコルを使用しますか?
nginx は下から上まで、トランスポート層が tcp/ip を使用し、アプリケーション層がプロセスのスケジュールを担当すると思います
2. ? echo 'hello tusheng' ; ?> 出力結果がありません。考えられる原因と、この問題を解決するプロセスを簡単に説明します (ヒント: 文法には問題ありません)。サーバー上で short_open_tag = がオフに設定され、php.ini でショート タグがオンになります。
3. 次のプログラムの出力結果を簡単に説明し、その理由と方法を説明します。この種の問題を解決しますか?
$tmp = 0 == "a"? 1: 2;
echo $tmp;> 結果 1 は int および string 型の強制によって発生します。 ="a"
0 == 0 は true でなければなりません
PHP は弱い型です。 。
$tmp = 0 === "a"? 1: 2;
echo $tmp; これは次のような文字列であることがわかります: $str = "1109063 milo 1";文字列内の文字 1109063 を置き換えるコードの 1 が $uid に、milo が $user に、1 が $type に割り当てられます
スペースは次のとおりです
list($uid, $user, $type) =explode( " ", $str);
t は次のとおりです
list ($uid, $user, $type) =explode("t", $str);
list($uid, $user, $type) = sscanf( $str, "%d %s %d");
$n = sscanf($auth, "%dt%s %s", $id, $first, $last); 5.および符号なし範囲 TINYINT SMALLINT MEDIUMINT INT
TINYINT-2 ^7 - 2^7-10 ~ 2^8-1
SMALLINT-2^15 - 2^15-1 0 ~ 2^16-1
MEDIUMINT-2^23 - 2^23-1 0 ~ 2^24 -1
INT-2^31 - 2^31-1 0 ~ 2^32-1
6. 次の配列を 1 行の文字列に組み立てます。おはようございます!
$ arr = array(
'I', 'AM', 'MILO!', 'DAY', 'DAY', 'UP!'
?> = strto lower(implode(" ",$arr ));
7. 次の関数を呼び出して関数を取得し、count の値を取得します
function get_list($cnd = array(), &$count = false)
{
// 疑似コードは $cnd を処理し、値を割り当てます。 datas
$datas = 'i am call back';
$count && $count = rand(1, 10000); ?>
$count=1;
$data = get_list($ cnd,&$count);
echo $count; それぞれの
mysql の利点と欠点を簡単に説明します。 memcache、Cookie は固有のステータス識別コードを維持します
9. 次の HTTP ステータス コードが表示されます 考えられる理由、処理方法
200、301、404、502、503
200
リクエストは成功し、応答ヘッダーまたはデータリクエストで予期される本文がこのレスポンスで返されます。
301
要求されたリソースは新しい場所に永久に移動されました。今後このリソースを参照する場合は、この応答で返されたいくつかの URI の 1 つを使用する必要があります。可能であれば、リンク編集機能を持つクライアントは、要求されたアドレスをサーバーから返されたアドレスに自動的に変更する必要があります。特に指定がない限り、この応答もキャッシュ可能です。 新しい永続 URI は、応答の Location フィールドで返される必要があります。これが HEAD リクエストでない限り、応答エンティティには新しい URI へのハイパーリンクと簡単な説明が含まれている必要があります。 これが GET または HEAD リクエストではない場合、リクエストの条件がそれに応じて変更される可能性があるため、ユーザーが確認しない限りブラウザは自動リダイレクトを禁止します。 注: HTTP/1.0 プロトコルを使用する一部のブラウザでは、送信した POST リクエストが 301 レスポンスを受信すると、後続のリダイレクト リクエストは GET メソッドになります。
404
リクエストは失敗しました。リクエストされたリソースがサーバー上に見つかりませんでした。この状態が一時的なものなのか永続的なものなのかをユーザーに伝える情報はありません。サーバーが状況を認識している場合は、410 ステータス コードを使用して、内部構成メカニズムの問題により古いリソースが永続的に利用できず、ジャンプ アドレスがないことを通知する必要があります。 404 ステータス コードは、サーバーがリクエストが拒否された理由を明らかにしたくない場合、または他の適切な応答が利用できない場合に広く使用されます。
502
ゲートウェイまたはプロキシとして動作しているサーバーが、リクエストを実行しようとしたときに、上流のサーバーから無効な応答を受け取りました。
503
一時的なサーバーメンテナンスまたは過負荷のため、サーバーは現在リクエストを処理できません。この状態は一時的なもので、一定時間が経過すると元に戻ります。遅延が予想される場合は、応答に遅延を示す Retry-After ヘッダーを含めることができます。この Retry-After メッセージが与えられない場合、クライアントは 500 応答を処理するのと同じ方法でそれを処理すべきです (SHOULD)。 注: 503 ステータス コードの存在は、サーバーが過負荷になったときにそれを使用する必要があることを意味するものではありません。一部のサーバーは、単にクライアントからの接続を拒否したいと考えています。
200 OK すべて問題なく、GET リクエストと POST リクエストに対する応答ドキュメントが続きます。
301 Moved Permanently クライアントによって要求されたドキュメントは別の場所にあります。新しい URL は Location ヘッダーに指定されています。404 Not Found 指定された場所にリソースが見つかりません。これもよくある反応です。
502 Bad Gateway サーバーがゲートウェイまたはプロキシとして機能する場合、次のサーバーにアクセスしてリクエストを完了しますが、サーバーは不正な応答を返します。
503 Service Unavailable メンテナンスまたは過負荷のため、サーバーが応答できませんでした。たとえば、データベース接続プールがいっぱいの場合、サーブレットは 503 を返すことがあります。サーバーは 503 を返すときに Retry-After ヘッダーを提供できます。
10. 次のデータベースがあります。元の mysql 拡張機能を使用して接続し、ユーザー テーブルの最初の 10 行をクエリします。
host: 192.168.0.254
port: 3306
user: one
pass: Piece
database: db_user
table : ユーザー
$ link = mysql_connect("192.168.0.254:3306","one","piece") または die('接続できませんでした: '.mysql_error())
mysql_select_db('db_user',$link);
$query = mysql_query("select * from user limit 10");
while($rs = mysql_fetch_array($query,MYSQL_ASSOC))
{}
11. autoload($class) を使用して、 Lib ディレクトリと互換性のあるサブディレクトリ
$request->action = lcfirst(implode(array_map(
'ucfirst',
explode('-', strto lower($request->action))
))); ---------------------------------------------------- ---- ----
関数 __autoload($class)
{
$cls = strto lower(str_replace("_","/",$class));
if(file_exsits(LIB.$cls.'. php'))
{
include_once(LIB.$cls.'.php');
}
else
{
die("{$class} クラスが見つかりません")
}
}
define("LIB") ,'/data /wwwroot/www.xx.com/lib/');
$author = new Lib_Author(); ---- ----------------------------------
function __authload($class)
{
$cls =explode("_ ",$class);
if(@is_dir($cls[1]))
{
if(@is_file($cls[2]))
{
include_once("CON_PATH".$cls) [1].' /'.$cls[2].".php");
}
else
{
}
}
else if(@is_file($cls[1]) .".php" ))
{
include_once("CON_PATH".$cls[1].".php")
}
else
{
dir('error'); ----- ----------------------------------
関数 __autoload($class)
{
$ cls =explode("_", $class);
$file = get_file($cls);
if($file=='error')
die('error')
include_once; );
}
function get_file($dir)
{
if(is_array($dir))
{
foreach($dir as $k=>$v)
{
$tmpdir .= $v.'/ ';
if(is_dir(' CON_PATH'.$tmpdir))
{
continue();
}
else if('CON_PATH'.$tmpdir.".php"))
{ 'CON_PATH' .$tmpdir.".php"
}
else
{
return 'error';
}
return 'error';
return 'error'
define("CON_PATH","/data) /wwwroot/www.xx.com/app/cntroller/");
$sb = 新しいコントローラー_sb();
---------------------- ---------- -----
function __autoload_my_classes($classname)
{
# ... ここにクラスを含めるロジック
}
spl_autoload_register('__autoload_my_classes')
---- ---------------------------------------------------- -------
12. set_error_handle を使用する エラーをキャプチャして出力するには、自分でレベルを設定します
set_error_handle(callback,level)
function callback(int $errno , string $errstr [, string $errfile [, int $ errline [, array $errcontext ]]] ){
}
function dealErrorHandler($errno,$errstr,$errfile,$errline)
{
switch($errno){
case E_USER_ERROR:
echo "エラー [$errno]ファイル $errfile の $errline 行で $errstr 致命的なエラーが発生しました";
break;
case E_USER_WARNING:
echo "私の警告 [$errno] $errstr":
break;
case E_USER_NOTICE:
echo "私の通知 [$errno] $errstr";
break;
デフォルト:
echo "unkonwn error type: [$errno] $errstr";
break;
}
}
set_erro_handler(dealErrorHandler);
trigger_error("notice", E_USER_NOTICE);
trigger_error ("warning", E_USER_WARNING);
trigger_error("error" , E_USER_ERROR);
13. PHP プログラムからの通知警告をシールドする 2 つの方法を簡単に説明します。
変数を初期化するか、ファイルの先頭にエラー レベルを設定するか、PHP を変更します。 ini で error_reporting を設定する
set_error_handler と @suppress エラー
1. error_reporting (E_ALL & ~E_NOTICE); を追加します。
2. php.ini を次のように変更します。error_reporting = E_ALL & ~E_NOTICE
3.error_reporting(0); php.inidisplay_errors=Off
14.instanceof の役割、
シングルケースモードでよく使われるデザインパターンですが、他のモードでも使用されます
15. 1023 はバイナリで表現され、計算プロセスは簡単に説明されます
10- 2
1023%2=1
511%2 =1
255%2 =1
127%2 =1
63%2 =1
31%2 =1
15% 2 =1
7%2 =1
3%2 =1
1%2 =1
0 =0
------ ---------------- ------------
1023
2^9=511
k=9
10 9 8 7 6 5 4 3 2 1
1 1 1 1 1 1 1 1 1 1
----------------------
1023 1
1023-1 /2=511 1
511-1/2=255 1
255 -1/2=127 1
127-1/2=63 1
63-1/2=31 1
31-1/2=15 1
15-1/2=7 1
7-1/2=3 1
3-1/2=1 1
---------------------- ------------------- -------------
2-10
2進数の各桁の数字を右端から掛け算するだけです右側の最初の数値に 2 の 0 乗を掛け、2 番目の数値を掛けます。最初の 2 のべき乗を掛け、3 番目の数値に 2 の累乗を掛けるなどして、n 番目の数値に (n- 1) 2 のべき乗を計算し、結果を加算します
例:110011=1*2^0+1*2^1+0*2^2+0*2^3+1*2^4+1* 2^5=51
これは An* 2^(n-1) という式とみなすこともできます。 An は右端の 2 進数から n 番目の数を表します。
を使用して第 1 項、第 2 項、第 3 項、および第 n 項を計算します。式 An*2^(n-1) を加算するだけです
$str = "aatbbtcc"; , $b, $c) =explode(' t', $str);
echo $a,$b,$c;
aabbcc;//'t' は t で文字列を切り取りません。爆発後、配列(0=>" aatbbtcc") が作成されます。 。 。 , 「t」に置き換えると「t」は切り取られます
17. どのようなエラー レベルが含まれ、return が必要ですか?
include はシステム警告を発行して実行を継続しますが、require はシステム警告を発行しますが、致命的なエラーを引き起こして終了します。
18. パラメータの数が不明な関数 (おそらく 5 または 50) があります。この関数を定義する方法
方法 1: PHP 組み込み関数を使用しない
方法 2: プロンプト func_num_args() func_get_arg( ) unc_get_args( )
function param()
{
$numargs = func_num_args();
echo "引数の数: $numargs
n";
if ($numargs >= 2) {
echo " 2 番目の引数は次のとおりです: " . func_get_arg(1) . "
n";
}
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++) {
echo " 引数 $i は: " . $arg_list[$i] . "
n"
param(1,2,3,4,5); #&* /
5 function otest1 ($a)
6 {
7 echo( '1 つのパラメータ' );
9
10 function otest2 ( $a,$b)
11 {
12 echo( '2パラメータ' );
13 }
14
15 関数 otest3 ( $a,$b,$c)
16 {
17 echo( 'Three' )
18 }
19
20 関数 otest()
21 {
関数内でグローバル変数を処理し (関数には return ステートメントがありません)、その値を変更するには、2 つのメソッド (global とreference&) を使用します。
$var = 'xxx';
echo $var.'--'
echo $var; --------------------
$test = 1;
$test1 = 2;
関数 get_yinyong()
{
グローバル $test1; "] = &$test1;
}
echo $test."n";
get_yinyong();
echo $test;
--------------------- ----------- --------
20. アプリケーションでは、ユーザー テーブルから 10 個のデータをランダムに取得して表示する状況がよくありますが、これをどのように実装するかを簡単に説明します。 SQL 関数と order by ステートメントは使用できません
テーブル ユーザー フィールド uid、ユーザー名
PHP を使用してユーザー テーブルの間隔を推定し、この ID より大きいか小さい場合、数十個のデータを制限します (十分に分散していない場合は、10 個のデータを保証します)。取得したデータのシャッフル関数は中断され、array_rand は 10
21 を取り出します。次の SQL ステートメントの uid が特定の値を取得できるとします。次のステートメントをクエリした後の uid の順序はどうなるでしょうか。入力の uid の順序に従って並べ替えます
uid が (10, 1, 3, 8, 11, 4, 7) であるユーザーから uid を選択します
印象的な結果は 1,3,4,7,8,10, 11 を昇順に並べます。中央の ID が昇順にならない場合があるため、特殊な状況があります。uid の順序に従って再利用する必要がある場合は、値を取得します。
22. PHP を使用して文字列内の文字を置換する Success **
preg_replace('/[a-zA-Z]*/','**' ,$str);
文字を指定すると str_replace('ooxx','**',$str); 2.php の実行結果はなぜでしょうか? ->2.php
Cookie、cookie time time()+3600 に問題があります
24. php でよく使用される json エンコード関数を簡単に説明し、json をデコードするときに配列を返す方法
25. SQL ステートメント内の ' / などの単語、SQL ステートメントの各特定の値に対して何を行うか
26. php でヘッダーを設定する方法
header(''); としていくつかのスクリプトがあります。 2.php
1.php
setcookie('test', 'cookie_test', 3600);
2.php
$cookie の出力を教えてください。 = isset($_COOKIE['test'])? $_COOKIE['test'];
echo $cookie
?>
1
概要
a関数またはメソッドで呼び出された場合、出力結果は同じになります。
b. include または include_once が関数またはメソッドで呼び出された場合、2 回目以降の呼び出しの結果が必要な場合は、 include_once の代わりに include を使用する必要があることに注意してください。
28. call_user_func の関数を簡単に説明します
関数またはクラス内の関数を呼び出し、最初のパラメーターの値を返します。同様の関数 call_user_func_array
29. nginx が設定されていると仮定して、server_name www.120.net xxx.120.net にアクセスします。
http://www.120.net/index.php および http://xxx.120.net/ にアクセスします。 index.php、
$_SERVER["SERVER_NAME"] と $_SERVER["REQUEST_URI"] はそれぞれ何ですか?
www.120.net xxx.120.net
/index.php /index.php
30 にあるファイルです。 linux 属性は drwxr-xr-x です。番号は、権限が
であることを示します。ディレクトリの権限は 755 です。所有者 u は、読み取り、書き込み、および変更の権限を持ち、彼が属するグループは g を持ちます。所属するグループ以外に、o には読み取りおよび変更の権限があります。
31. 理論上の 1Mbps の計算方法
1*1024/8
1M=1024KB
1KB=1024B
1B=8bit
パート 2
1. シングルトン + ファクトリ設計パターン抽象クラスの簡単な実装 例{ // パラメータ化されたファクトリ メソッド public static function Factory($type) { if (include_once 'Drivers/' . $ type .'.php') {
$classname = 'Driver_' . $type;
return new $classname;
throw new Exception ('ドライバが見つかりません')
}}// MySQL Driver$mysql = Example::factory('MySQL');
// SQLite ドライバーをロードする
$sqlite = Example::factory('SQLite')
defined('DRIVER','/data/wwwroot/www) .want.com/core/driver/');抽象クラス Example(){ プライベート関数 __construct() { } パブリック静的関数 Factory($type) { if(include_once(DRIVER.$type.'.php')) { return ExampleSon::singleton($type); } else { throw new Exception("ドライバーが見つかりません! "); } } }class ExampleSon は Example{ // クラスのインスタンスを保持します private static $instance; private class instance // プライベート コンストラクター。オブジェクトの直接作成を防止します。 private function __construct() { echo ' I am construction' } // シングルトン メソッド public static function singleton() { if (!isset(self::$instance) )) { //静的プライベート クラス インスタンスが設定されていない場合は作成 $c = __CLASS__; // クラス名を取得 self::$instance = new $c } return self::$instance } // メソッドの例 public; function bark() { echo 'Woof!'; } // ユーザーによるインスタンスのクローン作成を禁止します public function __clone( ) // クローンは許可されません {trigger_error('クローンは許可されません。', E_USER_ERROR); キーワード:
1 プライベート静的メンバー変数
2 __CLASS__ は現在のクラス名を取得します
3 パブリック静的メソッドはシングルトンを取得します
4 __clone() メソッドをオーバーライドします
----10 語: プライベート静的変数、パブリック静的メソッド----- ---
2. よく使用されるいくつかのマジック メソッドの例とその機能を説明します。
カスタマイズされたコンテンツをオブジェクトとして表示する場合は? __construct()
はオブジェクトをインスタンス化するときに呼び出されます
__construct とクラス名の関数が同時に存在する場合、__construct が呼び出され、もう一方は呼び出されません。
2. __destruct()
オブジェクトが削除されるか、オブジェクトの操作が終了するときに呼び出されます。
3. __call()
オブジェクトは特定のメソッドを呼び出します
メソッドが存在する場合は直接呼び出されます
存在しない場合は __call 関数が呼び出されます。
4. __get()
オブジェクトの属性を読み取る場合、
属性が存在する場合は属性値が直接返されます。
存在しない場合は __get 関数が呼び出されます。
5. __set()
オブジェクトの属性を設定する場合、
属性が存在する場合は値が直接割り当てられます。
存在しない場合は __set 関数が呼び出されます。
6. __toString()
オブジェクトを印刷するときに呼び出されます。 echo $obj; または print $obj; など。 __clone()
オブジェクトのクローンを作成するときに呼び出されます。例: $t=new Test();$t1=clone $t; __sleep()
はシリアル化の前に呼び出されます。オブジェクトが比較的大きく、シリアル化する前に少し削除したい場合は、この関数を検討できます。
9. __wakeup() は、シリアル化解除時に呼び出され、オブジェクトの初期化作業を実行します。
10. __isset()
オブジェクトの属性が存在するかどうかをチェックするときに呼び出されます。例: isset($c->name)。
11. __unset()
オブジェクトのプロパティの設定を解除するときに呼び出されます。例: unset($c->name)。
12. __set_state()
var_export が呼び出されたときに呼び出されます。 __set_state の戻り値を var_export の戻り値として使用します。
13. __autoload()
オブジェクトをインスタンス化する際、対応するクラスが存在しない場合、このメソッドが呼び出されます。
魔法定数
1. __LINE__
ファイル内の現在の行番号を返します。
2. __FILE__
ファイルのフルパスとファイル名を返します。インクルード ファイルで使用された場合は、インクルード ファイル名を返します。 PHP 4.0.2 以降、__FILE__ には常に絶対パスが含まれますが、それより前のバージョンには相対パスが含まれる場合がありました。
3. __FUNCTION__
関数名を返します (PHP 4.3.0 で新しく追加されました)。 PHP 5 以降、この定数は定義されたとおりの関数名を返します (大文字と小文字は区別されます)。 PHP 4 では、この値は常に小文字です。
4. __CLASS__
クラスの名前を返します (PHP 4.3.0 の新機能)。 PHP 5 以降、この定数は定義されたときのクラスの名前を返します (大文字と小文字は区別されます)。 PHP 4 では、この値は常に小文字です。
5. __METHOD__
クラスのメソッド名を返します (PHP 5.0.0 で新しく追加されました)。定義されたとおりのメソッド名を返します (大文字と小文字が区別されます)。
3. クラスの静的メソッドとインスタンス化されたクラスのメソッドの比較とメリットとデメリット
4. フォーラムがある
スレッドテーブルはトピックとタイトル情報を記録する
投稿テーブルはトピックの内容、返信内容、その他の情報を記録する
スレッドテーブルの主キーは tid
postsテーブル 主キーはpid、トピックマークはtidです
tidを介してスレッドと投稿を1対多で関連付けます
現在投稿データ量は1億件に達し、スレッドテーブルは2000万件、スレッドテーブルは約5件ありますトピックごとの返信
サブテーブルを設計し、post テーブルと thread テーブルを mysql テーブルに分割してください
5. MySQL のメイン ライブラリ/クラスター ライブラリが存在します。php をクエリするときに、php プログラムでマスターとスレーブの分離を実現するにはどうすればよいですか。 mysql のマスターとスレーブの分離とマスターとスレーブの配列の構成の利点は何ですか? いくつかのモデル関数を自分でファイル、シール、転送し、クエリ用にスレーブ構成のインスタンスをロードし、データを破壊する操作用にマスターをロードします。同時負荷容量は、データの保守とセキュリティに有益で、可用性が向上します。 欠点: データ同期に多少の遅延が発生します
6 UCenter のシングル サインオン メカニズムについて簡単に説明します
いわゆるシングル サインオンは何もありません。同期ログインと同期ログアウトを実現するには、複数のサイトでユーザー センターを共有するだけではありません。
実際、最終的にログインするのはユーザーですが、ajax (JavaScript は src を使用して非同期クロスドメイン呼び出しを行う) を使用しているため、ユーザーは気づきません。
そして、p3p ヘッダー、異なるドメイン名、シングル サインオン (ucenter が使用する Cookie) を使用して実装されます。
欠点は、Ajax クライアント リクエストを使用することです。アプリケーションが 10 個を超えると、ログイン速度が遅くなります。
7. Linux 関連のパッケージがあります http://www.120.net/test-1.0.0.tar.gz
a. それを /usr/local/src にダウンロードします
b. ソース コードをコンパイルしてインストールします。 /usr/local/test ディレクトリにコピーします
c. /usr/local/mysql ディレクトリにある mysql パッケージに依存します
ダウンロード、コンパイル、インストールのプロセスを書き込みます
wget - c http://www.120. net/test-1.0.0.tar .gz/usr/local/srctar zxvf /usr/local/src/test-1.0.0.tar.gzcd /usr/local/src/test-1.0.0./configure - -prefix=/usr/local/test --exec--prefix=/usr/local/mysqlmake testmake install
8. PHP の memcache 拡張機能を使用して、データを取得する関数を作成します (キャッシュが期限切れになり、タイムアウトしてロックされます)
a. データがタイムアウトになったら、mysql に移動してデータを取得します。取得後、memcache を更新します。b. mysql にアクセスしてデータを取得し、他のプロセスがデータを返します。メムキャッシュ
public function get_cache($key) { if($this->memcahe) { $var = $this->gt;memcahe->get($this->pre.$key); ;memcahe->get($this->pre.$key.'_valid'); if($var && !$valid) { $lock = $this->memcahe->get($this-> ;pre.$key.'_lock'); if(!$lock) { $this->memcahe->set($this->pre.$key.'_lock', true, 0, 60); false を返す; } } $var を返す; }
パブリック関数 set_cache($key, $var = null, $expire = 0) { if($this->memcahe) { $expire = (int)$ $expire = ($expire ? $expire : $this->memcahe->set($this->pre.$key, $var, 0, $expire+300) ); $this->memcahe->set($this->pre.$key.'_lock', false, 0, $expire); $this->memcahe->set($this-> ;pre.$key.'_valid', true, 0, $expire); return true; } return false;
9. キューとスタックの原理を簡単に説明します
両方とも 1 次元の配列として扱うことができます。キューは前進します 先出し、デキューは列の先頭でのみ可能、インラインは列の最後でのみ可能、スタックは後入れ先出し、プッシュとポップはスタックの先頭からです
とはスタックの動作原理は?
スタックは一種の抽象データ構造であり、その動作メカニズムは後入れ先出しです。新しい項目をスタックにプッシュすると、すでにスタック上にある項目はすべてスタックの奥深くにプッシュされます。同様に、スタックから項目を削除すると、スタック内の他のすべての項目がスタックの一番上に移動します。スタックの最上位の項目のみをスタックから削除でき、項目はスタックにプッシュされたのと同じ順序でスタックから残ります。自動販売機の積み込みと受け取りのプロセスを思い出して理解するとよいでしょう。
10. arrayaccess は次のように定義されており、配列の実装に使用します
ArrayAccess {
/* Methods */
abstract public boolean offsetExists ( string $offset )
abstract publicmixed offsetGet ( string $offset )
abstract public void offsetSet ( string $offset , string $value )
abstract public void offsetUnset ( string $offset )
}
class 単一の実装 ArrayAccess{ private $name; private function __construct() { } static function load() { if(null = = self::$_Instance) { self::$_Instance = new Single(); } return self::$_Instance; } public function setName($name) { $this->name = $name; } public function getName () { return $this->name; } /*** 4 つのメソッドを実装します * offsetExists()、要素が定義されているかどうかを識別するために使用されます * offsetGet()、要素の値を返すために使用されます * offsetSet()、要素の新しい値を設定するために使用されます * offsetUnset()、要素と対応する値を削除するために使用されます **/ public function offsetSet($offset, $value) { if (is_null($offset)) { $this->container [] = $値; } else { $this->container[$offset] = $value; } } public function offsetGet($offset) { return isset($this->container[$offset]) ? ->コンテナ [$offset] : null; } public function offsetExists($offset) { return isset($this->container[$offset]) } public function offsetUnset($offset) { unset($this->) ;container[$ offset]); }}$s = Single::load();$s->setName("jack");$s["name"] = "mike";echo $s-> getName(); //jackecho $s["name"]; //mike
11. coreseek のインストール ディレクトリは /usr/local/coreseek であるとします。設定ファイルは /usr/local/coreseek/etc/test です。 conf
インデックス名は post です
a. インデックスを作成します
b. サービスを開始します
c. インデックスを再構築します (再構築プロセス中に検索サービスがまだ利用可能であることを確認します)
indexer -c /usr/local/coreseek/ etc/test.conf --allsearchd -c /usr/local/ coreseek/etc/test.conf Indexer -c /usr/local/coreseek/etc/test.conf --all --rotate12 があるとします。テーブルを作成し、そのテーブルに対してスフィンクスの増分準リアルタイム インデックス作成を実行します。 ソリューションについて説明します。
「メイン インデックス + 増分インデックス」メソッドを使用して、データベースにカウント テーブルを追加して、テーブルの最後のデータ ID を記録する簡単な実装があります。メイン インデックスが再構築されるたびにインデックス付きテーブルが作成されるため、増分インデックスが作成される場合は、この ID の後のデータにインデックスを付けるだけで済み、メイン インデックスが再構築されるたびにこのテーブルを更新する必要があります。
13. PHP コード:
$i = 97;$a = ($i++) + (++$i) + $i ;$b = (--$i) + ($i--) + $i + 6;
echo "$i, $a, $b";出力結果は何ですか
97, 295, 299
97
97+99+99
98+98+97+6
14. 次のコードを使用してクライアント IP を取得します: if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $onlineip = getenv('HTTP_CLIENT_IP');} elseif( getenv ('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $onlineip = getenv('HTTP_X_FORWARDED_FOR');} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR') , 'unknown')) { $onlineip = getenv('REMOTE_ADDR');} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], '不明 ')) { $onlineip = $_SERVER['REMOTE_ADDR'];} ただし、HTTP_ で始まるリクエスト ヘッダーは、クライアントによって偽装される可能性のある情報です。リバース プロキシ環境では、PHP が偽装された HTTP_CLIENT_IP を受信しないようにする方法があります。 、HTTP_X_FORWARDED_FOR 値?
15. たとえば、Google や Baidu などの大規模な Web サイトでは、異なるクライアント (携帯電話と PC など) を使用して同じ URL にアクセスすると、表示されるページが異なります。 実用的な解決策を提供できればボーナスポイント。
それは user_agent によって簡単に判断できますが、非常に予備的なものです
可能であれば、サーバーまたはモバイル端末の特性、または WAP ゲートウェイの受け入れ情報などを使用してください。環境php.iniを設定しますか? onoff17. File_get_contents は、PHP がリモート http インターフェイスを呼び出すときに使用できますが、リモート ホストにアクセスできない場合、または応答が遅すぎる場合、ローカルの PHP プロセスが長時間中断されるため、安定性に影響します。ローカルサーバー。PHP プロセスが長時間かかる場合、タイムアウトを回避するにはどうすればよいですか?
file_get_contents でタイムアウトを設定できますか? )
);
file_get_contents("http://www.want.com/", 0, $ctx);
curl を使用してリモート http インターフェイスを取得することもできます。curl_setopt($s) も設定する必要があります。 ,CURLOPT_TIMEOUT,$timeout);
18. 上記の質問と同じですが、DNS クエリが遅すぎるとタイムアウトが発生します。 19. mysql 文字セット set names * コマンドによって設定されるシステム変数はどれですか? (ACE) A. Character_set_client B. Character_set_system C. Character_set_results D. Character_set_server E. Character_set_connection F. Character_set_database20. 大文字と小文字を区別しない照合規則はどれですか? (A) A. utf8_general_ci B. utf8_general_cs C. utf8_general_bin21. XSS 攻撃を防ぐ方法
strip_tags を最初にフィルタリングすることも、特殊なタグを処理して ASCII コードに置き換える独自のフィルタ関数を作成することもできます。 Web アプリケーション側で CSRF 脆弱性を防御するには、一般にリファラー、トークン、または検証コードが使用されます。tokenf メソッドは比較的信頼できます。
上記では、関連コンテンツも含めて PHP 面接の質問の共有について紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。