検索
ホームページphp教程php手册PHP チュートリアル: 9 つの実践的な PHP 関数

PHP を長年使用していても、存在を知らなかった機能や機能に遭遇することがあります。それらの中には、非常に便利ですが、十分に活用されていないものもあります。誰もがマニュアルや機能リファレンスのページを最初から最後まで読むわけではありません。

1. 任意の数のパラメータを持つ関数

すでにご存知かもしれませんが、PHP ではオプションのパラメーターを使用して関数を定義できます。ただし、任意の数の関数パラメーターを完全に許可するメソッドもあります。以下はオプションのパラメーターの例です:

// function with 2 optional arguments
function foo($arg1 = '', $arg2 = '') {

	echo "arg1: $arg1\n";
	echo "arg2: $arg2\n";

}

foo('hello','world');
/* prints:
arg1: hello
arg2: world
*/

foo();
/* prints:
arg1:
arg2:
*/

次に、任意の数の引数を受け入れる関数を作成する方法を見てみましょう。今回は func_get_args() 関数を使用する必要があります:

// yes, the argument list can be empty
function foo() {

	// returns an array of all passed arguments
	$args = func_get_args();

	foreach ($args as $k => $v) {
		echo "arg".($k+1).": $v\n";
	}

}

foo();
/* prints nothing */

foo('hello');
/* prints
arg1: hello
*/

foo('hello', 'world', 'again');
/* prints
arg1: hello
arg2: world
arg3: again
*/

2. Glob() を使用してファイルを検索します

多くの PHP 関数には、長くてわかりやすい名前が付いています。ただし、何度も使用して慣れていない限り、glob() 関数で何ができるかを理解するのは難しい場合があります。これは、scandir() 関数のより強力なバージョンと考えてください。パターンに基づいてファイルを検索できます。

// get all php files
$files = glob('*.php');

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
)
*/

次のように複数のファイルを取得できます:

// get all php files AND txt files
$files = glob('*.{php,txt}', GLOB_BRACE);

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
    [4] => log.txt
    [5] => test.txt
)
*/

これらのファイルは、クエリ条件に応じて実際にパスを返す可能性があることに注意してください:

$files = glob('../images/a*.jpg');

print_r($files);
/* output looks like:
Array
(
    [0] => ../images/apple.jpg
    [1] => ../images/art.jpg
)
*/

各ファイルのフルパスを取得したい場合は、realpath() 関数を呼び出すことができます:

$files = glob('../images/a*.jpg');

// applies the function to each array element
$files = array_map('realpath',$files);

print_r($files);
/* output looks like:
Array
(
    [0] => C:\wamp\www\images\apple.jpg
    [1] => C:\wamp\www\images\art.jpg
)
*/

3. メモリ使用量情報

スクリプトのメモリ使用量を検出することにより、コードの最適化に役立ちます。 PHP は、ガベージ コレクターと非常に高度なメモリ マネージャーを提供します。スクリプトの実行中に使用されるメモリの量は増減する可能性があります。現在のメモリ使用量を取得するには、memory_get_usage() 関数を使用できます。任意の時点でメモリ使用量を最大にする必要がある場合は、memory_limit() 関数を使用できます。

echo "Initial: ".memory_get_usage()." bytes \n";
/* prints
Initial: 361400 bytes
*/

// let's use up some memory
for ($i = 0; $i < 100000; $i++) {
	$array []= md5($i);
}

// let's remove half of the array
for ($i = 0; $i < 100000; $i++) {
	unset($array[$i]);
}

echo "Final: ".memory_get_usage()." bytes \n";
/* prints
Final: 885912 bytes
*/

echo "Peak: ".memory_get_peak_usage()." bytes \n";
/* prints
Peak: 13687072 bytes
*/

4. CPU 使用率情報

これを行うには、getrusage() 関数を使用します。この機能は Windows プラットフォームでは利用できないことに注意してください。

print_r(getrusage());
/* prints
Array
(
    [ru_oublock] => 0
    [ru_inblock] => 0
    [ru_msgsnd] => 2
    [ru_msgrcv] => 3
    [ru_maxrss] => 12692
    [ru_ixrss] => 764
    [ru_idrss] => 3864
    [ru_minflt] => 94
    [ru_majflt] => 0
    [ru_nsignals] => 1
    [ru_nvcsw] => 67
    [ru_nivcsw] => 4
    [ru_nswap] => 0
    [ru_utime.tv_usec] => 0
    [ru_utime.tv_sec] => 0
    [ru_stime.tv_usec] => 6269
    [ru_stime.tv_sec] => 0
)

*/

システム管理者権限をすでに持っていない限り、これは少し不思議に思えるかもしれません。各値の説明は次のとおりです (これらを覚える必要はありません):

ru_oublock: block output operations
ru_inblock: block input operations
ru_msgsnd: messages sent
ru_msgrcv: messages received
ru_maxrss: maximum resident set size
ru_ixrss: integral shared memory size
ru_idrss: integral unshared data size
ru_minflt: page reclaims
ru_majflt: page faults
ru_nsignals: signals received
ru_nvcsw: voluntary context switches
ru_nivcsw: involuntary context switches
ru_nswap: swaps
ru_utime.tv_usec: user time used (microseconds)
ru_utime.tv_sec: user time used (seconds)
ru_stime.tv_usec: system time used (microseconds)
ru_stime.tv_sec: system time used (seconds)

スクリプトが消費する CPU パワーを知るには、「ユーザー時間」パラメータと「システム時間」パラメータの値を確認する必要があります。デフォルトでは、秒とマイクロ秒の部分が別々に提供されます。 100 万マイクロ秒で除算し、秒パラメータ値を追加すると、合計秒数を 10 進数形式で取得できます。例を見てみましょう:

// sleep for 3 seconds (non-busy)
sleep(3);

$data = getrusage();
echo "User time: ".
	($data['ru_utime.tv_sec'] +
	$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
	($data['ru_stime.tv_sec'] +
	$data['ru_stime.tv_usec'] / 1000000);

/* prints
User time: 0.011552
System time: 0
*/

スクリプトの実行には約 3 秒かかりましたが、CPU 使用率は非常に低かったです。スリープ実行中、スクリプトは実際には CPU リソースを消費しないためです。ディスク操作の待機など、時間はかかるものの CPU 時間を消費しないタスクは他にもたくさんあります。ご覧のとおり、CPU 使用率と実際の実行時間の長さは常に同じではありません。以下に例を示します:

// loop 10 million times (busy)
for($i=0;$i<10000000;$i++) {

}

$data = getrusage();
echo "User time: ".
	($data['ru_utime.tv_sec'] +
	$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
	($data['ru_stime.tv_sec'] +
	$data['ru_stime.tv_usec'] / 1000000);

/* prints
User time: 1.424592
System time: 0.004204
*/

これには約 1.4 秒の CPU 時間がかかりましたが、システムコールがなかったのでほぼすべてのユーザー時間がかかりました。システム時間は、プログラムのシステム コールの実行に費やされる CPU オーバーヘッドです。以下に例を示します:

$start = microtime(true);
// keep calling microtime for about 3 seconds
while(microtime(true) - $start < 3) {

}

$data = getrusage();
echo "User time: ".
	($data['ru_utime.tv_sec'] +
	$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
	($data['ru_stime.tv_sec'] +
	$data['ru_stime.tv_usec'] / 1000000);

/* prints
User time: 1.088171
System time: 1.675315
*/

現在、かなりのシステム時間が消費されています。これは、スクリプトが microtime() 関数を複数回呼び出すため、必要な時間を取得するためにオペレーティング システムへのリクエストが必要になるためです。実行時間の合計が 3 秒未満であることにも気づくでしょう。これは、サーバー上に同時に他のプロセスが存在し、スクリプトが 3 秒間ずっと CPU を 100% 使用していない可能性があるためです。

5. 魔法定数

PHP は、現在の行番号 (__LINE__)、ファイル パス (__FILE__)、ディレクトリ パス (__DIR__)、関数名 (__FUNCTION__)、クラス名 (__CLASS__)、メソッド名 (__METHOD__)、および名前空間 (__NAMESPACE__) を取得する機能を提供します。 ) など、便利な魔法の定数。この記事ではそのすべてについては説明しませんが、いくつかの使用例を紹介します。他のスクリプト ファイルをインクルードする場合は、__FILE__ 定数を使用します (または、PHP5.3 の新しい __DIR__ 定数を使用します):

// this is relative to the loaded script's path
// it may cause problems when running scripts from different directories
require_once('config/database.php');

// this is always relative to this file's path
// no matter where it was included from
require_once(dirname(__FILE__) . '/config/database.php');

デバッグを簡単にするには、__LINE__ を使用します。特定の行番号を追跡できます。

// some code
// ...
my_debug("some debug message", __LINE__);
/* prints
Line 4: some debug message
*/

// some more code
// ...
my_debug("another debug message", __LINE__);
/* prints
Line 11: another debug message
*/

function my_debug($msg, $line) {
	echo "Line $line: $msg\n";
}

6. 一意の識別子を生成します

シナリオによっては、一意の文字列を生成する必要がある場合があります。正確にはこの目的を意図したものではないにもかかわらず、多くの人が md5() 関数を使用しているのを見かけます:

// generate unique string
echo md5(time() . mt_rand(1,1000000));

実際には、これに使用することを目的とした uniqid() という名前の PHP 関数があります。

// generate unique string
echo uniqid();
/* prints
4bd67c947233e
*/

// generate another unique string
echo uniqid();
/* prints
4bd67c9472340
*/

文字列は一意ですが、最初の数文字は似ていることに気づくかもしれません。これは、生成された文字列がサーバー時刻を基準にしているためです。しかし、実際には、新しく生成された各 ID がアルファベット順に並べられるため、ソートが簡単になるという親切な側面もあります。重複の可能性を減らすために、接頭辞、またはエントロピーを増やす 2 番目の引数を渡すことができます:

// with prefix
echo uniqid('foo_');
/* prints
foo_4bd67d6cd8b8f
*/

// with more entropy
echo uniqid('',true);
/* prints
4bd67d6cd8b926.12135106
*/

// both
echo uniqid('bar_',true);
/* prints
bar_4bd67da367b650.43684647
*/

この関数は md5() よりも短い文字列を生成し、スペースを節約します。

7.連載

複雑な変数をデータベースまたはテキスト ファイルに保存する必要がある状況に遭遇したことがありますか?文字列をフォーマットして配列またはオブジェクトに変換する適切な方法がわからない場合があります。PHP にはこの機能が用意されています。変数をシリアル化するには 2 つの一般的な方法があります。以下は、serialize() 関数と unserialize() 関数を使用する例です。

// a complex array
$myvar = array(
	'hello',
	42,
	array(1,'two'),
	'apple'
);

// convert to a string
$string = serialize($myvar);

echo $string;
/* prints
a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";}
*/

// you can reproduce the original variable
$newvar = unserialize($string);

print_r($newvar);
/* prints
Array
(
    [0] => hello
    [1] => 42
    [2] => Array
        (
            [0] => 1
            [1] => two
        )

    [3] => apple
)
*/

这是原生的 PHP 序列化方法。然而,由于 JSON 近年来大受欢迎,PHP5.2 中已经加入了对 JSON 格式的支持。现在你可以使用 json_encode() 和 json_decode() 函数:

// a complex array
$myvar = array(
	'hello',
	42,
	array(1,'two'),
	'apple'
);

// convert to a string
$string = json_encode($myvar);

echo $string;
/* prints
["hello",42,[1,"two"],"apple"]
*/

// you can reproduce the original variable
$newvar = json_decode($string);

print_r($newvar);
/* prints
Array
(
    [0] => hello
    [1] => 42
    [2] => Array
        (
            [0] => 1
            [1] => two
        )

    [3] => apple
)
*/

这将更为行之有效,尤其与 JavaScript 等许多其他语言兼容。然而对于复杂的对象,某些信息可能会丢失。

8、压缩字符串

在谈到压缩时,我们通常想到文件压缩,如 ZIP 压缩等。在 PHP 中字符串压缩也是可能的,但不涉及任何压缩文件。在下面的例子中,我们要利用 gzcompress() 和 gzuncompress() 函数:

$string =
"Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nunc ut elit id mi ultricies
adipiscing. Nulla facilisi. Praesent pulvinar,
sapien vel feugiat vestibulum, nulla dui pretium orci,
non ultricies elit lacus quis ante. Lorem ipsum dolor
sit amet, consectetur adipiscing elit. Aliquam
pretium ullamcorper urna quis iaculis. Etiam ac massa
sed turpis tempor luctus. Curabitur sed nibh eu elit
mollis congue. Praesent ipsum diam, consectetur vitae
ornare a, aliquam a nunc. In id magna pellentesque
tellus posuere adipiscing. Sed non mi metus, at lacinia
augue. Sed magna nisi, ornare in mollis in, mollis
sed nunc. Etiam at justo in leo congue mollis.
Nullam in neque eget metus hendrerit scelerisque
eu non enim. Ut malesuada lacus eu nulla bibendum
id euismod urna sodales. ";

$compressed = gzcompress($string);

echo "Original size: ". strlen($string)."\n";
/* prints
Original size: 800
*/

echo "Compressed size: ". strlen($compressed)."\n";
/* prints
Compressed size: 418
*/

// getting it back
$original = gzuncompress($compressed);

这种操作的压缩率能达到 50% 左右。另外的函数 gzencode() 和 gzdecode() 能达到类似结果,通过使用不同的压缩算法。

9、注册停止功能

有一个函数叫做 register_shutdown_function(),可以让你在某段脚本完成运行之前,执行一些指定代码。假设你需要在脚本执行结束前捕获一些基准统计信息,例如运行的时间长度:

// capture the start time
$start_time = microtime(true);

// do some stuff
// ...

// display how long the script took
echo "execution took: ".
		(microtime(true) - $start_time).
		" seconds.";

这似乎微不足道,你只需要在脚本运行的最后添加相关代码。但是如果你调用过 exit() 函数,该代码将无法运行。此外,如果有一个致命的错误,或者脚本被用户意外终止,它可能无法再次运行。当你使用 register_shutdown_function() 函数,代码将继续执行,不论脚本是否停止运行:

$start_time = microtime(true);

register_shutdown_function('my_shutdown');

// do some stuff
// ...

function my_shutdown() {
	global $start_time;

	echo "execution took: ".
			(microtime(true) - $start_time).
			" seconds.";
}

英文原稿:9 Useful PHP Functions and Features You Need to Know Nettuts



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

我们今天主要是来看一看golang time 包的时间应用方式。两者的一般规则是「wall time」用于告知时间,而「monotonic clock」用于测量时间;除外还有其他的时钟处理方式。

五个精选的Go语言开源项目,带你探索技术世界五个精选的Go语言开源项目,带你探索技术世界Jan 30, 2024 am 09:08 AM

在当今科技快速发展的时代,编程语言也如雨后春笋般涌现出来。其中一门备受瞩目的语言就是Go语言,它以其简洁、高效、并发安全等特性受到了许多开发者的喜爱。Go语言以其强大的生态系统而著称,其中有许多优秀的开源项目。本文将介绍五个精选的Go语言开源项目,带领读者一起探索Go语言开源项目的世界。KubernetesKubernetes是一个开源的容器编排引擎,用于自

使用C#中的Array.Sort函数对数组进行排序使用C#中的Array.Sort函数对数组进行排序Nov 18, 2023 am 10:37 AM

标题:C#中使用Array.Sort函数对数组进行排序的示例正文:在C#中,数组是一种常用的数据结构,经常需要对数组进行排序操作。C#提供了Array类,其中有Sort方法可以方便地对数组进行排序。本文将演示如何使用C#中的Array.Sort函数对数组进行排序,并提供具体的代码示例。首先,我们需要了解一下Array.Sort函数的基本用法。Array.So

Go语言开发必备:5个热门框架推荐Go语言开发必备:5个热门框架推荐Mar 24, 2024 pm 01:15 PM

《Go语言开发必备:5个热门框架推荐》Go语言作为一门快速、高效的编程语言,受到越来越多开发者的青睐。为了提高开发效率,优化代码结构,很多开发者选择使用框架来快速搭建应用。在Go语言的世界中,有许多优秀的框架可供选择。本文将介绍5个热门的Go语言框架,并提供具体的代码示例,帮助读者更好地理解和使用这些框架。1.GinGin是一个轻量级的Web框架,拥有快速

使用Golang的Web框架Echo框架实现分布式任务调度使用Golang的Web框架Echo框架实现分布式任务调度Jun 24, 2023 am 11:49 AM

随着互联网的发展和信息技术的进步,大数据时代已经来临,数据分析、机器学习等领域也得到了广泛的应用。在这些领域中,任务调度是一个不可避免的问题。如何实现高效的任务调度,对于提高效率至关重要。在本篇文章中,将介绍如何使用Golang的Web框架Echo框架实现分布式任务调度。一、介绍Echo框架Echo是一个高性能、可伸缩、轻量级的GoWeb框架。它基于HTT

Laravel开发:如何使用Laravel Echo和Pusher实现WebSockets通信?Laravel开发:如何使用Laravel Echo和Pusher实现WebSockets通信?Jun 13, 2023 pm 05:01 PM

Laravel是一个流行的PHP框架,具有高度可扩展性和高效性,它提供了很多强大的工具和库,让开发者可以快速构建高质量的Web应用程序。其中,LaravelEcho和Pusher是两个非常重要的工具,通过它们可以很容易地实现WebSockets通信,本文将详细介绍如何在Laravel应用程序中使用这两个工具。什么是WebSockets?WebSockets

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code<form name="myform"

PHP中echo关键字的作用和使用方法详解PHP中echo关键字的作用和使用方法详解Jun 28, 2023 pm 08:12 PM

PHP中echo关键字的作用和使用方法详解PHP是一种广泛使用的服务器端脚本语言,它在网页开发中被广泛应用。而echo关键字是在PHP中用于输出内容的一种方法。本文将详细介绍echo关键字的作用和使用方法。作用:echo关键字的主要作用是将内容输出到浏览器。在网页开发中,我们需要将数据动态地呈现到前端页面上,这时就可以使用echo关键字将数据输出到页面上。e

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター