ホームページ >バックエンド開発 >PHPチュートリアル >php.ini でセーフ MOD をオフにすると、どのような関数やパラメータが影響を受けますか?

php.ini でセーフ MOD をオフにすると、どのような関数やパラメータが影響を受けますか?

WBOY
WBOYオリジナル
2016-06-13 12:24:571277ブラウズ

PHPインタビューまとめ

8月15日に北京に来てから今日まで、1ヶ月以上が経ちました。この間、筆記試験や面接の準備を進め、大小合わせて10社以上の面接を受け、ようやく落ち着いたところです。面接を通して自分が大きく成長したと感じました。初めてこの見知らぬ街に来たとき、私は地下鉄に乗る方法も、バスに乗る方法も、正しい生活を送る方法もわかりませんでした。 。 。

私の学校は平凡すぎたので、面接では高学歴の学生に比べて本当に自信があります。秋。私の面接の方向性は、PHP 開発エンジニアとして、主に Web サイトのバックエンド、APP インターフェイスなどに取り組んでいます。 私がインタビューした企業、テストの質問、体験談はすべて私の個人ウェブサイトに掲載されています。興味があればご覧ください: http://dwz.cn/1KMpea以下は私がこの期間のインタビューでまとめた常識事項ですので、皆さんのお役に立てれば幸いです。間違いがあればご指摘ください。

概要:

面接でよく聞かれる質問をもとにphp部分をまとめました 以下の質問は面接で出現率が高いです。質問は比較的基本的なものです

-------- - ----------PHP 部分----------

PHP のいくつかの出力関数 echo、print()、print_r()、sprintf()、var_dump() の違い

1: echo: 関数ではなくステートメントです。戻り値はなく、括弧なしで複数の変数値を出力できます。配列とオブジェクトは出力できません。出力できるのは単純な型 (int、string など) のみです。

2: print: これは関数ではなくステートメントであり、戻り値は 1 であり、括弧は必要ありません。配列とオブジェクトは出力できません。出力できるのは単純な型 (int、string など) のみです。

3: print_r: は、string、int、float、array、object などの複合型を出力できる関数です。

出力 配列は構造体で表され、print_r($str,true) を使用して print_r の出力を防止し、print_r によって処理された値を返すことができます

4: printf : テキストを変換する関数です フォーマット後の出力 (C 言語を参照)

5: sprintf: printf に似た関数ですが、印刷は行わず、フォーマットされたテキストを返します(この関数はフォーマットされたテキストを次の形式に変換します。文字列は出力ではなく変数に書き込まれます)。それ以外の場合は printf と同じです。

例: $str = "Hello"; $number = 123;

$txt = sprintf("%s 世界。 number %u",$str,$number); //出力: Hello world. 曜日番号 123

6: var_dump(): 関数、内容、型、または文字列を出力します。変数の内容、タイプ、長さ。デバッグによく使用されます。

複数のスレッドが同時にファイルを読み書きする問題を解決する関数を作成します。

<span style="color: #008080;"> 1</span> <?<span style="color: #000000;">php</span><span style="color: #008080;"> 2</span>     <span style="color: #800080;">$fp</span> = <span style="color: #008080;">fopen</span>("/tmp/lock.txt","w+"<span style="color: #000000;">);</span><span style="color: #008080;"> 3</span>     <span style="color: #0000ff;">if</span>(<span style="color: #008080;">flock</span>(<span style="color: #800080;">$fp</span>, LOCK_EX)){<span style="color: #008000;">//</span><span style="color: #008000;"> 进行排它型锁定</span><span style="color: #008080;"> 4</span>         <span style="color: #008080;">fwrite</span>(<span style="color: #800080;">$fp</span>,"Write something here\n"<span style="color: #000000;">);</span><span style="color: #008080;"> 5</span>         <span style="color: #008080;">flock</span>(<span style="color: #800080;">$fp</span>, LOCK_UN);<span style="color: #008000;">//</span><span style="color: #008000;"> 释放锁定</span><span style="color: #008080;"> 6</span>     }<span style="color: #0000ff;">else</span><span style="color: #000000;">{</span><span style="color: #008080;"> 7</span>         <span style="color: #0000ff;">echo</span> "Couldn't lock the file !"<span style="color: #000000;">;</span><span style="color: #008080;"> 8</span> <span style="color: #000000;">    }</span><span style="color: #008080;"> 9</span>     <span style="color: #008080;">fclose</span>(<span style="color: #800080;">$fp</span><span style="color: #000000;">);</span><span style="color: #008080;">10</span> ?>

Cookie セッション使用プランを無効にする、 メソッドセッションの有効期限を設定します。対応する関数:

URL を介して値を渡し、セッション ID を URL に追加します (欠点: 純粋に静的なページのセッション ID は次のページに渡されないため、サイト全体に純粋に静的なページは存在できません)

通过隐藏表单,把session id 放到表单的隐藏文本框中同表单一块提交过去(缺点:不适用标签这种直接跳转的非表单的情况)

直接配置php.ini文件,将php.ini文件里的session.use_trans_sid= 0设为1,(好像在win上不支持)

用文件、数据库等形式保存Session ID,在跨页过程中手动调用

<span style="color: #008080;"> 1</span> 第一种  <span style="color: #008080;">setcookie</span><span style="color: #000000;">() 直接用setcookie设置session id的生命周期。</span><span style="color: #008080;"> 2</span> <span style="color: #008080;"> 3</span>     <span style="color: #800080;">$lifetime</span>=60; <span style="color: #008000;">//</span><span style="color: #008000;">保存1分钟 </span><span style="color: #008080;"> 4</span>     <span style="color: #008080;">session_start</span><span style="color: #000000;">(); </span><span style="color: #008080;"> 5</span>     <span style="color: #008080;">setcookie</span>(<span style="color: #008080;">session_name</span>(), <span style="color: #008080;">session_id</span>(), <span style="color: #008080;">time</span>()+<span style="color: #800080;">$lifetime</span>, "/"<span style="color: #000000;">);</span><span style="color: #008080;"> 6</span> 第二种  <span style="color: #008080;">session_set_cookie_params</span><span style="color: #000000;">()    </span><span style="color: #008080;"> 7</span>     <span style="color: #800080;">$lifetime</span>=60;<span style="color: #008000;">//</span><span style="color: #008000;">保存1分钟</span><span style="color: #008080;"> 8</span>     <span style="color: #008080;">session_set_cookie_params</span>(<span style="color: #800080;">$lifetime</span><span style="color: #000000;">);</span><span style="color: #008080;"> 9</span>     <span style="color: #008080;">session_start</span><span style="color: #000000;">();</span><span style="color: #008080;">10</span>     <span style="color: #008080;">session_regenerate_id</span>(<span style="color: #0000ff;">true</span><span style="color: #000000;">);</span><span style="color: #008080;">11</span>     其中session_regenerate_id();方法用于改变当前session_id的值,并保留session中数组的值。参数默认为 <span style="color: #0000ff;">false</span>,如果设置为true则改变session_id的值,并清空当前session数组。

 

json格式数据有哪些特点 

    JSON 一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、 Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(网络传输速率)。

JSON的结构基于下面两点

1. "名称/值"对的集合 不同语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),键列表(keyed list)等
2. 值的有序列表 多数语言中被理解为数组(array)

 

php获取文件内容的方法,对应的函数

1:file_get_contents得到文件的内容(可以以get和post的方式获取),整个文件读入一个字符串中

2:用fopen打开url, 以get方式获取内容(借助fgets()函数)

3:用fsockopen函数打开url(可以以get和post的方式获取),以get方式获取完整的数据,包括header和body

4:使用curl库获取内容,使用curl库之前,需要查看php.ini,查看是否已经打开了curl扩展

 

php数组函数常见的那些? (array_merge、in_array的作用)

一、数组操作的基本函数

    array_values($arr);    //获得数组的值

    array_keys($arr);       //获得数组的键名

    array_flip($arr);         //数组中的值与键名互换(如果有重复前面的会被后面的覆盖)

    array_search('PHP',$arr);   //检索给定的值,加true则是严格类型检查

    array_reverse($arr);            //将数组中的元素翻转

    in_array("apple", $arr);      //在数组中检索apple

    array_key_exists("apple", $arr);    // 检索给定的键名是否存在数组中

    array_count_values($arr);             // 统计数组中所有值出现的次数

2. 配列の分割と充填

array_slice($arr, 0, 3);この関数は、キー名 (配列セグメント) を無視します。

array_splice($arr, 0, 3, array("black","maroon") ); //配列からセグメントを削除できます。前の関数との違いは、返されたシーケンスが元の配列から削除されることです

array_chunk($arr) , 3 , TRUE); // 配列は複数に分割できます。TRUE は元の配列のキー名を保持します (複数の配列に分割します)

4. 配列とスタック、キュー

array_push($arr, "apple", "pear") // 1 つ以上の要素を最後にプッシュします。配列スタック (プッシュ) の、スタックにプッシュされた要素の数を返します

array_pop($arr) // 配列スタックの最後の要素をポップ (ポップ)

array_shift($arr); //配列の最初の要素が外に移動されて返されます (配列の長さは 1 減り、他の要素は 1 つ前に移動されます)配置され、数値キー名が 0 から変更されます (カウント、テキスト キー名は変更されません)

array_unshift($arr,"a",array(1,2)); //配列の先頭に 1 つ以上の要素を挿入します


6. 配列の並べ替え

sort($arr);小さいものから大きいものへ、キー名を無視します rsort($arr) //大きいものから小さいものへ、キー名を無視します

asort($arr);小さいものから大きいものまで、キー名を維持します arsort($arr) // 大きいものから小さいものまで、キー名を維持します

ksort( $arr); // キー名順にソート krsort($arr) // キー名順に逆順にソート

7. 配列計算

array_sum($arr) // 配列内のすべての要素の合計演算を実行します (配列要素の合計)

array_merge($arr1, $arr2); // 2 つ以上をマージします (同じ文字列キー名、後者は前のキー名、同じ数値キー名、後者を上書きします) 1 つは最後に追加されます)

array_diff($arr1, $arr2); // を返します。差分結果配列 array_diff_assoc($arr1, $arr2 , $arr3); // 差分セットの結果配列を返し、キー名も比較されます

array_intersect($arr1, $arr2); // 交差結果の配列を返します array_intersect_assoc($arr1, $arr2) // 交差結果の配列を返します。キー名も比較されます


8. その他の配列関数

array_unique($arr); //配列内の重複した値を削除します。元のキー名は保持されます。新しい配列

shuffle ($arr);

php のマジック メソッドとマジック定数

方法:__construct(),__destruct(),    方法重载:__call(),__callStatic()。

属性重载:__get(),__set(),__isset(),__unset(),这四个只对类中,私有,受保护的成员属性有效

__toString(),__autoload();

_set_state(); //自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。 本方法的唯一参数是一个数组。

 

__clone();       //通常用于对副本进行重新初始化,

说明:this指副本对象引用,that指原对象引用 等方法在 PHP 中被称为”魔术方法”。PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。

 

常量:__LINK__     //文件中的当前行号。

        __FILE__       //文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

        __DIR__       //文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录,它等价于 dirname(__FILE__)。

 

        __FUNCTION__      //函数名称。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

        __CLASS__             //类的名称。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

        __METHOD__        //类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

        __NAMESPACE__   //当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增)

 

PHP 如何获取客户端的IP地址,

用$_SERVER获取的IP地址有什么问题?

$_SERVER['REMOTE_ADDR'] ;   通过全局数组来获得 

getenv('REMOTE_ADDR') ; 通过环境变量来获得

当客户机使用代理的时候获取不到真实的IP地址

 

写一个函数,可以遍历文件夹下的所有文件和文件夹。

<span style="color: #008080;"> 1</span>     <span style="color: #0000ff;">function</span> get_dir_info(<span style="color: #800080;">$path</span><span style="color: #000000;">){</span><span style="color: #008080;"> 2</span>           <span style="color: #800080;">$handle</span> = <span style="color: #008080;">opendir</span>(<span style="color: #800080;">$path</span>);<span style="color: #008000;">//</span><span style="color: #008000;">打开目录返回句柄</span><span style="color: #008080;"> 3</span>           <span style="color: #0000ff;">while</span>((<span style="color: #800080;">$content</span> = <span style="color: #008080;">readdir</span>(<span style="color: #800080;">$handle</span>))!== <span style="color: #0000ff;">false</span><span style="color: #000000;">){</span><span style="color: #008080;"> 4</span>                 <span style="color: #800080;">$new_dir</span> = <span style="color: #800080;">$path</span> . DIRECTORY_SEPARATOR . <span style="color: #800080;">$content</span><span style="color: #000000;">;</span><span style="color: #008080;"> 5</span>                 <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$content</span> == '..' || <span style="color: #800080;">$content</span> == '.'<span style="color: #000000;">){</span><span style="color: #008080;"> 6</span>                        <span style="color: #0000ff;">continue</span><span style="color: #000000;">;</span><span style="color: #008080;"> 7</span> <span style="color: #000000;">                }</span><span style="color: #008080;"> 8</span>                 <span style="color: #0000ff;">if</span>(<span style="color: #008080;">is_dir</span>(<span style="color: #800080;">$new_dir</span><span style="color: #000000;">)){</span><span style="color: #008080;"> 9</span>                       <span style="color: #0000ff;">echo</span> "<br>目录:".<span style="color: #800080;">$new_dir</span> . '<br>'<span style="color: #000000;">;</span><span style="color: #008080;">10</span>                       get_dir_info(<span style="color: #800080;">$new_dir</span><span style="color: #000000;">);</span><span style="color: #008080;">11</span>                 }<span style="color: #0000ff;">else</span><span style="color: #000000;">{</span><span style="color: #008080;">12</span>                       <span style="color: #0000ff;">echo</span> "文件:".<span style="color: #800080;">$path</span>.':'.<span style="color: #800080;">$content</span> .'<br>'<span style="color: #000000;">;</span><span style="color: #008080;">13</span> <span style="color: #000000;">                }</span><span style="color: #008080;">14</span> <span style="color: #000000;">          }</span><span style="color: #008080;">15</span> <span style="color: #000000;">      }</span><span style="color: #008080;">16</span>       get_dir_info(<span style="color: #800080;">$dir</span>);

 

有mail.log的一个文档,内容为若干邮件地址,用’\n’分隔换行。挑选sina.com的地址(包括从文件读取、过滤到列印出来)。

思路1:用正则表达式(比较慢,效率地,不推荐用)

思路2:cat mail.log | grep sina.com

 

PHP缓存技术有哪些? tp是局部还是完全缓存?

1. ページ全体の静的キャッシュ。つまり、すべてのページが HTML 静的ページとして生成され、ユーザーがアクセスすると、PHP サーバーの解析プロセスを経由せずに直接アクセスされます。 🎜>2. ページの部分キャッシュ。頻繁に変更されないページの部分は静的にキャッシュされ、頻繁に変更されるブロックはキャッシュされず、最終的にまとめられて表示されます。
3.キャッシュ、ID によってリクエストされたデータは php ファイルにキャッシュされます。ID とファイルは対応しています。次回この ID を通じてリクエストが行われると、php ファイルが直接読み取られます。 >4. クエリ キャッシュとデータ キャッシュはクエリ ステートメントに応じてほぼ同じです。
5. 一般的に使用されるキャッシュ テクノロジは次のとおりです。 > 個人的には、tp はグローバル キャッシュであるべきだと思います。理由は次のとおりです。 tp キャッシュは実際である データベースから読み取ったデータを保存するためにローカルに php ファイルを生成する


strlen() と mb_strlen の関数と違い

PHP では、strlen と mb_strlen は文字列の長さを調べる関数です

PHP の組み込みの文字列長関数 strlen は、中国語の文字列を正しく処理できません。文字列が占有しているバイト数だけを取得します。 GB2312 の中国語エンコードの場合、strlen で取得される値は中国語の文字数の 2 倍ですが、UTF-8 エンコードされた中国語の場合は 3 倍になります (UTF-8 エンコードでは、1 つの中国語文字が 3 バイトを占有します)。

mb_strlen 関数を使用すると、この問題をより適切に解決できます。 mb_strlen の使用法は strlen と似ていますが、文字エンコーディングを指定する 2 番目のオプションのパラメーターがある点が異なります。たとえば、UTF-8 文字列 $str の長さを取得するには、mb_strlen($str,'UTF-8') を使用できます。 2 番目のパラメータを省略した場合は、PHP の内部エンコーディングが使用されます。内部エンコーディングは、mb_internal_encoding() 関数を通じて取得できます。

mb_strlen は PHP のコア関数ではないことに注意してください。これを使用する前に、php_mbstring.dll が php.ini にロードされていること、つまり make を確認する必要があります。 「extension=php_mbstring.dll」という行が存在し、コメントアウトされていないことを確認してください。そうしないと、未定義の関数の問題が発生します。


標準 URL から拡張子をできるだけ効率的に抽出する関数を作成します

$arr = parse_url('http://www.sina.com.cn/abc/de/fg.php?id=1');

$result = pathinfo($arr['path']);var_dump($arr);

var_dump($result['extension']);

PHP でセーフ MOD をオフにすることで影響を受ける関数とパラメーター。少なくとも6つ書きますか?

move_uploaded_file() exec()

system() passthru()

popen()rename()から🎜>>🎜>

touch()                               symlink()

link()                                   parse_ini_file()

set_time_limit()                  max_execution_time mail()

 

一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停 的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。

<span style="color: #008080;"> 1</span> <<span style="color: #000000;">?php</span><span style="color: #008080;"> 2</span>  <span style="color: #0000ff;">function</span> fuhuan(<span style="color: #800080;">$allnum</span>, <span style="color: #800080;">$ti</span><span style="color: #000000;">){</span><span style="color: #008080;"> 3</span>   <span style="color: #800080;">$arr</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();</span><span style="color: #008080;"> 4</span>   <span style="color: #0000ff;">for</span>(<span style="color: #800080;">$i</span> = 0; <span style="color: #800080;">$i</span> < <span style="color: #800080;">$allnum</span>; <span style="color: #800080;">$i</span>++<span style="color: #000000;">){</span><span style="color: #008080;"> 5</span>    <span style="color: #800080;">$arr</span>[<span style="color: #800080;">$i</span>] = <span style="color: #800080;">$i</span><span style="color: #000000;">;</span><span style="color: #008080;"> 6</span> <span style="color: #000000;">  }</span><span style="color: #008080;"> 7</span>  <span style="color: #008080;"> 8</span>   <span style="color: #800080;">$nums</span> = 1<span style="color: #000000;">;</span><span style="color: #008080;"> 9</span>   <span style="color: #0000ff;">while</span>(<span style="color: #008080;">count</span>(<span style="color: #800080;">$arr</span>) > 1<span style="color: #000000;">){</span><span style="color: #008080;">10</span>    <span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$arr</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$value</span><span style="color: #000000;">) {</span><span style="color: #008080;">11</span>     <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$nums</span> == <span style="color: #800080;">$ti</span><span style="color: #000000;">){</span><span style="color: #008080;">12</span>      <span style="color: #0000ff;">unset</span>(<span style="color: #800080;">$arr</span>[<span style="color: #800080;">$key</span><span style="color: #000000;">]);</span><span style="color: #008080;">13</span>      <span style="color: #800080;">$nums</span> = 1<span style="color: #000000;">;</span><span style="color: #008080;">14</span>     }<span style="color: #0000ff;">else</span><span style="color: #000000;">{</span><span style="color: #008080;">15</span>      <span style="color: #800080;">$nums</span>++<span style="color: #000000;">;</span><span style="color: #008080;">16</span> <span style="color: #000000;">    }</span><span style="color: #008080;">17</span> <span style="color: #000000;">   }</span><span style="color: #008080;">18</span> <span style="color: #000000;">  }</span><span style="color: #008080;">19</span>   <span style="color: #800080;">$new_arr</span> = <span style="color: #008080;">array_values</span>(<span style="color: #800080;">$arr</span><span style="color: #000000;">);</span><span style="color: #008080;">20</span>   <span style="color: #008080;">var_dump</span>(<span style="color: #800080;">$new_arr</span>[0] + 1<span style="color: #000000;">);</span><span style="color: #008080;">21</span> <span style="color: #000000;"> }</span><span style="color: #008080;">22</span>  fuhuan(10,10);

isset() 、empty()与is_null的区别

1、当变量未定义时,is_null()和“参数本身”是不允许作为参数判断的,会报Notice警告错误;

2、empty,isset首先都会检查变量是否存在,然后对变量值进行检测。而is_null 和 “参数本身”只是直接检查变量值,是否为null,因此如果变量未定义就会出现错误!

3、isset():仅当null和未定义,返回false;

4、empty():""、0、"0"、NULL、FALSE、array(),未定义,均返回false;

5、is_null():仅判断是否为null,未定义 报警告;

6、变量本身作为参数,与empty()一致,但接受未定义变量时,报警告;

 

求两个文件的相对路径

<span style="color: #008080;"> 1</span> getpath('/a/b/c/d/e.php', '/a/d/12/34/c.php'<span style="color: #000000;">);</span><span style="color: #008080;"> 2</span> <span style="color: #008080;"> 3</span>  <span style="color: #0000ff;">function</span> getpath(<span style="color: #800080;">$a</span>, <span style="color: #800080;">$b</span><span style="color: #000000;">){</span><span style="color: #008080;"> 4</span>   <span style="color: #800080;">$aarr</span> = <span style="color: #008080;">explode</span>('/', <span style="color: #800080;">$a</span><span style="color: #000000;">);</span><span style="color: #008080;"> 5</span>   <span style="color: #800080;">$barr</span> = <span style="color: #008080;">explode</span>('/', <span style="color: #800080;">$b</span><span style="color: #000000;">);</span><span style="color: #008080;"> 6</span>   <span style="color: #800080;">$count</span> = <span style="color: #008080;">count</span>(<span style="color: #800080;">$barr</span>) - 2<span style="color: #000000;">;</span><span style="color: #008080;"> 7</span>   <span style="color: #800080;">$pathinfo</span> = ''<span style="color: #000000;">;</span><span style="color: #008080;"> 8</span>   <span style="color: #0000ff;">for</span>(<span style="color: #800080;">$i</span> = 1; <span style="color: #800080;">$i</span> <= <span style="color: #800080;">$count</span>; <span style="color: #800080;">$i</span>++<span style="color: #000000;">){</span><span style="color: #008080;"> 9</span>    <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$aarr</span>[<span style="color: #800080;">$i</span>] == <span style="color: #800080;">$barr</span>[<span style="color: #800080;">$i</span><span style="color: #000000;">]){</span><span style="color: #008080;">10</span>     <span style="color: #800080;">$pathinfo</span> .= '../'<span style="color: #000000;">;</span><span style="color: #008080;">11</span>    }<span style="color: #0000ff;">else</span><span style="color: #000000;">{</span><span style="color: #008080;">12</span>     <span style="color: #800080;">$pathinfo</span> .= <span style="color: #800080;">$barr</span>[<span style="color: #800080;">$i</span>] . '/'<span style="color: #000000;">;</span><span style="color: #008080;">13</span> <span style="color: #000000;">   }</span><span style="color: #008080;">14</span> <span style="color: #000000;">  }</span><span style="color: #008080;">15</span>   <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$pathinfo</span><span style="color: #000000;">;</span><span style="color: #008080;">16</span>  }

MVC的优缺点

1. MVC の利点
(1) をモデルに対して実行できます。複数のビューを同時に作成して使用します。変更伝播メカニズムにより、関連するすべてのビューがモデル データの変更をタイムリーに受信できるようになり、関連するすべてのビューとコントローラーが同期して動作できるようになります。
(2) ビューとコントローラーのプラグイン可能性により、ビューとコントローラー オブジェクトの置き換えが可能になり、動的に開いたり、要求に基づいて閉じたり、実行中にオブジェクトを置き換えたりすることもできます。
(3) モデルの移植性。モデルはビューから独立しているため、モデルを独立して移植して新しいプラットフォームで動作させることができます。必要なのは、新しいプラットフォーム上のビューとコントローラーに新たな変更を加えるだけです。
(4) 潜在的なフレームワーク構造。インターフェイスの設計だけでなく、このモデルに基づいてアプリケーション フレームワークを構築できます。
2. MVC の欠点
🎜> システムの構造と実装が複雑になります。単純なインターフェイスの場合、MVC に厳密に従ってモデル、ビュー、コントローラーを分離すると、構造が複雑になり、更新操作が多すぎて操作効率が低下する可能性があります。
(2) ビューとコントローラー間の接続が強すぎます。ビューとコントローラーは互いに分離されたコンポーネントですが、実際には密接に関連しています。ビューにはコントローラーが存在しないため、その用途は非常に限定されており、その逆もまた同様であり、そのため独立した再利用が妨げられています。
(3) View のモデル データへのアクセスが非効率的です。モデルの操作インターフェイスによっては、十分な表示データを取得するためにビューを複数回呼び出す必要がある場合があります。変更されていないデータへの不必要に頻繁なアクセスも、運用パフォーマンスに悪影響を及ぼします。
(4) 現在、一般に高度なインターフェイス ツールやコンストラクターは MVC モードをサポートしていません。これらのツールを MVC のニーズに合わせて調整し、個別のコンポーネントを作成するにはコストがかかるため、MVC の使用が困難になります。

セッションと Cookie (動作メカニズム) の関係と違い、セッション共有の問題解決済み 解決策:

相違点と関連性:

使用session_start()调用session,服务器端在生成session文件的同时生成session ID哈希值和默认值为PHPSESSID的session name,并向客户端发送变量为PHPSESSID(session name)(默认)值为一个128位的哈希值。服务器端将通过该cookie与客户端进行交互,session变量的值经php内部系列化后保存在服务器 机器上的文本文件中,和客户端的变量名默认情况下为PHPSESSID的coolie进行对应交互,即服务器自动发送了http 头:header(‘Set-Cookie: session_name()=session_id(); path=/’);即setcookie(session_name(),session_id());当从该页跳转到的新页面并调用 session_start()后,PHP将检查与给定ID相关联的服务器端存贮的session数据,如果没找到则新建一个数据集。

共享方案:

1:使用数据库保存session, 使用数据库来保存session,就算服务器宕机了也没事,session照样在。

问题:程序需要定制;每次请求都进行数据库读写开销不小,另外数据库是一个单点,可以做数据库的hash来解 决这个问题。

2:使用 memcached来保存session, 这种方式跟数据库类似,内存存取性能比数据库好很多。

问题:程序需要定制,增加 了工作量;存入memcached中的数据都需要序列化,效率较低,断电或者重启电脑容易丢失数据;

3: 通过加密的cookie,在A服务器上登录,在用户的浏览器上添加加密的cookie,当用户访问B服务器时,检查有无Session,如果没有,就检验 Cookie是否有效,Cookie有效的话就在B服务器上重建session。简单,高效, 服务器的压力减小了,因为session数据不存在服务器磁盘上。根本就不会出现session读取不到的问题。

问题:网络请求占用很多。每次请求时,客户端都要通过cookie发送session数据给服务器,session中数据不能太多,浏览器对cookie 的大

小存在限制。不适合高访问量的情况,因为高访问量的情况下。

正则表达式

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 
匹配首尾空格的正则表达式:(^\s*)|(\s*$) 
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 
匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$

 

--------------------linux部分---------------------

core文件是什么,有什么用?

<span style="font-family: Microsoft YaHei; font-size: 14px;"> core是unix系统的内核。当你的程序出现内存越界的时候,操作系统会中止你的进程,并将当前内存状态倒出到core文件中,以便进一步分析。程序员可以通过core文件来找出问题所在。它记录了程序挂掉时详细的状态描述。</span>
<span style="font-family: Microsoft YaHei; font-size: 14px;"><strong>什么是core dump</strong> Core的意思是内存, Dump的意思是扔出来, 堆出来。开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的,它可以做为调试程序的参考.    core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump。如何使用core文件 gdb -c core文件路径 [应用程序的路径],进去后输入where回车, 就可以显示程序在哪一行当掉的, 在哪个函数中.</span>
<span style="font-family: Microsoft YaHei; font-size: 14px;"><strong>为什么没有core文件生成呢?</strong> core文件的生成跟你当前系统的环境设置有关系, 可以用下面的语句设置一下, 然后再运行程序便成生成core文件.</span>
<span style="font-family: Microsoft YaHei; font-size: 14px;"><strong>ulimit -c unlimited</strong> core文件生成的位置一般于运行程序的路径相同, 文件名一般为core.进程号</span>

不用core文件,程序出了问题产生信号是否知道?答:内核向进程发信号嘛。

 

ファイルマッピング以外にメモリを共有する方法はありますか?

共有メモリ オブジェクト マッピング。

この 2 つの違いは何ですか:

答え: メモリ マップト ファイルは、ファイルをメモリ ブロックにマッピングしたものです。メモリ ポインタは、ファイルがロードされているメモリにアクセスするのと同じように、ディスク上のファイルにアクセスするため、メモリ ファイル マッピングは大きなファイルの管理に非常に適しています。

次の 10 個のシェル コマンドの目的を説明してください
top, ps, mv 、 find、 df、 cat、 chmod、 chgrp、 grep、 wc

top: このコマンドは、Linux で一般的に使用される パフォーマンス分析ツール です。リアルタイムで表示可能 システム内の各プロセスのリソース使用状況は、Windows タスク マネージャーと同様です。

ps: プロセスの表示

mv: ファイルの移動または変更

find : サブディレクトリ内の一致するファイルを検索します。

df: Linux の df コマンド パラメーター機能: ファイル システムのディスク領域の使用状況を確認します。

cat: 1 つ以上のファイルの内容を標準出力に表示します

chmod: ファイル属性を変更します

chgrp: ユーザーのグループ化を変更します。

grep: ファイル内を検索します。

wc: コマンドの機能は、ユーザーのグループ化をカウントすることです。指定したファイルのバイト数、ワード数、行数、統計結果を表示、出力します。

Linux ファイルのプロパティは何ですか? (合計10桁)

-rw-r--r--これは許可記号です、合計は------これらの桁です。

最初のダッシュはファイル タイプ識別子です。 - は通常のファイル、c はキャラクター デバイス (キャラクター)、b はブロック デバイス (ブロック)、d はディレクトリ (ディレクトリ) を意味します。 l はリンク ファイル (リンク) を表します。その後の最初の 3 つの連続したダッシュはユーザー許可ビット (User)、2 番目の連続した 3 つのダッシュはグループ許可ビット (Group)、3 番目の連続した 3 つのダッシュはグループ許可ビットです。 (グループ)。ダッシュはその他の許可ビット (その他) を示します。各許可ビットには、r (読み取り許可)、w (書き込み許可)、x (実行許可) の 3 つの許可があります。各権限ビットに権限がある場合、完全な権限は -rwxrwxrwx になります。空の権限は - --- --- --- となります。

chmod コマンドを使用してアクセス許可を設定できます。形式は chmod ugoa /-/=rwx ファイル名/ディレクトリです。例:

ファイル aaa には完全に空の権限があります - --- --- ---。

chmod u rw aaa (ユーザー許可ビットに読み取りおよび書き込み許可を設定します。許可は次のように表されます: - rw- --- ---)

chmod g r aaa (グループが読み取り可能になるように権限を設定します。その権限は次のように表されます: - --- r--- ---)

chmod ugo rw aaa (ユーザー、グループ、他のユーザーまたはグループに読み取りと書き込みの権限を設定します。権限は次のように表現されます: - rw- rw- rw-)

If aaa has完全な権限 - rwx rwx rwx。

chmod u-x aaa (ユーザーの実行可能権限を削除します。権限は次のように表現されます: - rw- rwx rwx)

aaa を付与する場合カスタマイズ権限 - rwx r-x r-x、コマンドは次のとおりです:

chmod u=rwx, go=rx aaa

------サーバー部分------ ---------------

Apache と Nginx の長所と短所の比較
1. Apache に対する nginx の利点:
軽量で容量が大きいApache よりもスペースが少なく、メモリとリソースが少ない。高度にモジュール化された設計で、モジュールの作成は比較的簡単です
非同時実行性、nginx はリクエストを非同期かつノンブロッキングで処理し、Apache がブロックしている間、複数の接続 (10,000 レベル) が 1 つのプロセスに対応できます。同期マルチプロセス モデル。高い同時実行性では、nginx は静的ファイルを適切に処理し、低リソース、低消費、高パフォーマンスを維持できます。静的処理パフォーマンスは Apache の 3 倍以上です

2. Apache の nginx に対する利点:


Apache の書き換えはさらに優れています。 nginx の書き換えよりも強力で、多くのモジュールがあり、基本的に考えられるものはすべて見つかります、比較的安定しており、バグは少ないですが、nginx には比較的多くのバグがあります

3: 理由: これは、Nginx が最新の epoll (Linux 2.6 カーネル) および kqueue (freebsd) ネットワーク I/O モデルを使用するのに対し、Apache は従来の select モデルを使用するためです。現在、Linux での大量の同時アクセスに耐えることができる Squid と Memcached は、どちらも epoll ネットワーク I/O モデルを使用しています。 多数の接続の読み取りと書き込みを処理するには、Apache が採用する選択ネットワーク I/O モデルは非常に非効率です。

cgi と fastcgi の違い

CGI は 2000 年以前に多く使用されていました。以前は、Web サーバーは静的なリクエストのみを処理していました。このリクエストの内容に基づいて、Web サーバーは外部の C プログラム (または Perl スクリプト) を実行するために新しいプロセスをフォークしていました。 .)、このプロセスは処理されたデータを Web サーバーに返します。最後に、Web サーバーはコンテンツをユーザーに送信し、フォークされたばかりのプロセスも終了します。 ユーザーが次回動的スクリプトの変更を要求すると、Web サーバーは再び新しいプロセスをフォークし、サイクルが継続します。

その後、Web サーバーに Perl インタープリターまたは php インタープリターを組み込むことができる、より高度な方法が登場しました。 つまり、これらのインタープリタはモジュール化されており、Web サーバーは起動時にこれらのインタープリタを起動します。 新しい動的リクエストが受信されると、Web サーバーはこれらの Perl または php スクリプトを独自に解析するため、プロセスを再フォークする必要がなくなり、効率が向上します。

fastcgi の方法は、Web サーバーがリクエストを受信したときにプロセスを再フォークしないことです (このプロセスは Web サーバーの起動時に開始され、終了しないため) Web サーバーは直接転送します。このプロセスに渡されるコンテンツ (プロセス間通信、ただし、fastcgi は他のメソッド、つまり tcp 通信を使用します)、このプロセスはリクエストを受信した後に処理し、結果を Web サーバーに返し、最後に次のリクエストが到着するのを待ちます。辞めるの。
fastcgi と cgi の違いは次のとおりです。
データの処理プロセスに関してcgi
新しいものをフォークする処理用プロセス プロセスまたはローカルプロセス 接続を確立するには、TCP ポートを開き、ループに入り、データの到着を待ち、データを処理します
例: サーバー 現在、100,000 個の単語があり、顧客は毎回文字列を送信し、この文字列が先頭に付く単語の数を尋ねます。 その後、トライ ツリーを構築するプログラムを作成すると、ユーザーがリクエストするたびにトライを直接検索できるようになります。 しかし、CGI を使用すると、このリクエストの後にトライが失われ、次回プロセスが開始されるときに、新しいトライ ツリーを作成する必要があります。これはあまりにも非効率です。 fastcgi メソッドを使用すると、このレッスンのトライ ツリーはプロセスの開始時に確立され、後でトライ ツリー上の指定されたプレフィックスを直接クエリできます。


select、pol、epoll の違い

select

select は、1983 年に 4.2BSD で初めて登場しました。これは、select() システム コールを通じて複数のファイル記述子の配列を監視します。select() が返されると、配列が準備完了です。はカーネルによって変更され、プロセスが後続の読み取りおよび書き込み操作のためにこれらのファイル記述子を取得できるようになります。

select は現在、ほぼすべてのプラットフォームでサポートされており、優れたクロスプラットフォーム サポートも利点の 1 つです。実際、これは今後も残る数少ない利点の 1 つです。 。 1つ。

select の欠点は、単一プロセスが監視できるファイル記述子の最大数に制限があることです (Linux では通常 1024 です)。ただし、この制限は次の方法で変更できます。マクロ定義を変更するか、カーネルを再コンパイルすることによっても、この制限を引き上げることができます。

また、多数のファイル記述子を格納する select() によって維持されるデータ構造は、ファイル記述子の数が増加するにつれて、コピーのオーバーヘッドも直線的に増加します。同時に、ネットワーク応答時間の遅延により、多数の TCP 接続が非アクティブになりますが、select() を呼び出すとすべてのソケットの線形スキャンが実行されるため、ある程度のオーバーヘッドも無駄になります。

poll

poll は、1986 年の System V Release 3 で誕生しました。本質的には select とあまり変わりませんが、poll は違いはありません。ファイル記述子の数に最大の制限があります。

ポーリングと選択には、多数のファイル記述子を含む配列が、これらに関係なく、ユーザー モードとカーネルのアドレス空間の間で全体としてコピーされるという欠点もあります。ファイル記述子 記述子の準備ができているかどうかに関係なく、ファイル記述子の数が増加するにつれて、そのオーバーヘッドは直線的に増加します。

さらに、select() と poll() が準備ができたファイル記述子についてプロセスに通知した後、プロセスがそのファイル記述子に対して IO 操作を実行しない場合、次回 select() と poll のときに再度報告されます。 () が呼び出されるため、通常は準備完了メッセージが失われないため、このメソッドはレベル トリガー (レベル トリガー) と呼ばれます。

epoll

カーネルによって直接サポートされる実装メソッド、つまり epoll が登場したのは、Linux 2.6 まででした。これまでのすべての機能を備えており、前述したすべての利点を備えているため、Linux 2.6 では最もパフォーマンスの高いマルチチャネル I/O 準備完了通知方法として認識されています。

epoll は、レベル トリガーとエッジ トリガーの両方をサポートできます (エッジ トリガー。どのファイル記述子が準備できたかをプロセスに通知するだけです。それは 1 回だけ通知されます。アクションを実行しない場合)この方法はエッジ トリガーと呼ばれます)、理論的にはエッジ トリガーのパフォーマンスが高くなりますが、コードの実装は非常に複雑です。

epoll も、それらの準備完了ファイル記述子のみを通知します。また、準備完了ファイル記述子を取得するために epoll_wait() を呼び出すと、返されるのは実際の記述子ではなく、準備完了状態の表現です。記述子の数の値を取得するには、epoll で指定された配列に移動して、対応する数のファイル記述子を順番に取得するだけです。ここではメモリ マッピング (mmap) テクノロジも使用されており、これらのファイル記述子の必要性が完全に排除されます。システム内で呼び出されたときのコピーのオーバーヘッド。