PHP pthread를 사용하는 방법
php pthreads 사용 방법: 1. "pecl install pthreads"를 통해 pthread를 설치합니다. 2. 여러 스레드를 제어해야 하고 동시에 하나의 스레드만 작동할 수 있는 경우 뮤텍스 잠금을 사용합니다.
이 문서의 운영 환경: Windows 7 시스템, PHP 버전 7.0.2, DELL G3 컴퓨터
PHP 다중 스레드 pthread 설치 및 사용
Pthreads를 설치하려면 기본적으로 PHP를 다시 컴파일해야 하며 다음을 추가해야 합니다. -enable-maintainer-zts 매개변수이지만 이 문서는 거의 사용되지 않습니다. 버그가 많고 예상치 못한 문제가 많을 것이며 프로덕션 환경은 하하하하하하하하하하, 그냥 이걸 가지고 놀아보세요. 실제 멀티스레딩에는 Python을 사용하세요. C 등
다음 코드의 대부분은 인터넷에서 가져온 것입니다. Stackable
Stackable은 작업자 스레드에 의해 실행되는 작업입니다. 실행 전, 실행 후, 실행 중에 Stackable 객체를 동기화하고 읽고 쓸 수 있습니다.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
4. 뮤텍스 잠금은 어떤 상황에서 발생합니까? 사용될까? 여러 스레드를 제어해야 하고 동시에 하나의 스레드만 작동할 때 사용할 수 있습니다. 뮤텍스 잠금이 있는 경우와 없는 경우의 차이점을 설명하는 간단한 카운터 프로그램
1 |
|
다중 스레드 및 공유 메모리
공유 메모리의 예에서는 잠금이 사용되지 않으며 여전히 정상적으로 작동할 수 있습니다. 작업 메모리 작업 자체에는 lock 함수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
5. 스레드 동기화 일부 시나리오에서는 thread->start()가 프로그램 실행을 시작하는 것을 원하지 않지만 스레드가 명령을 기다리기를 원합니다. $thread->wait();의 테스트 기능은 스레드가 thread->start() 직후에 실행되지 않는다는 것입니다. $thread->notify();6. Thread poolA Pool 클래스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
$tmp
= tempnam(
__FILE__
, 'PHP');
$key
=
ftok
(
$tmp
, 'a');
$shmid
= shm_attach(
$key
);
$counter
= 0;
shm_put_var(
$shmid
, 1,
$counter
);
class
CounterThread
extends
Thread {
public
function
__construct(
$shmid
){
$this
->shmid =
$shmid
;
}
public
function
run() {
$counter
= shm_get_var(
$this
->shmid, 1 );
$counter
++;
shm_put_var(
$this
->shmid, 1,
$counter
);
printf(
"Thread #%lu says: %s\n"
,
$this
->getThreadId(),
$counter
);
}
}
for
(
$i
=0;
$i
<100;
$i
++){
$threads
[] =
new
CounterThread(
$shmid
);
}
for
(
$i
=0;
$i
<100;
$i
++){
$threads
[
$i
]->start();
}
for
(
$i
=0;
$i
<100;
$i
++){
$threads
[
$i
]->join();
}
shm_remove(
$shmid
);
shm_detach(
$shmid
);
?>
로그인 후 복사
7. 멀티 스레드 파일의 안전한 읽기 및 쓰기LOCK_SH 공유 잠금 획득(읽기 프로그램)LOCK_EX 독점 잠금 획득(쓰기 프로그램LOCK_UN 해제 잠금( 공유 또는 독점 여부) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
- LOCK_NB 잠금 시 Flock()이 차단되는 것을 원하지 않는 경우
- 8. 멀티스레딩 및 데이터 연결 pdo와 pthread를 동시에 사용하는 경우 다음이 필요합니다. 정적 선언 public static $dbh가 필요한 한 가지 사항에 주의하고 싱글톤 모드
- Worker 및 PDOPool 및 PDO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php
class
Update
extends
Thread {
public
$running
= false;
public
$row
=
array
();
public
function
__construct(
$row
) {
$this
->row =
$row
;
$this
->sql = null;
}
public
function
run() {
if
(
strlen
(
$this
->row['bankno']) > 100 ){
$bankno
= safenet_decrypt(
$this
->row['bankno']);
}
else
{
$error
= sprintf(
"%s, %s\r\n"
,
$this
->row['id'],
$this
->row['bankno']);
file_put_contents
(
"bankno_error.log"
,
$error
, FILE_APPEND);
}
if
(
strlen
(
$bankno
) > 7 ){
$sql
= sprintf(
"update members set bankno = '%s' where id = '%s';"
,
$bankno
,
$this
->row['id']);
$this
->sql =
$sql
;
}
printf(
"%s\n"
,
$this
->sql);
}
}
class
Pool {
public
$pool
=
array
();
public
function
__construct(
$count
) {
$this
->
count
=
$count
;
}
public
function
push(
$row
){
if
(
count
(
$this
->pool) <
$this
->
count
){
$this
->pool[] =
new
Update(
$row
);
return
true;
}
else
{
return
false;
}
}
public
function
start(){
foreach
(
$this
->pool
as
$id
=>
$worker
){
$this
->pool[
$id
]->start();
}
}
public
function
join(){
foreach
(
$this
->pool
as
$id
=>
$worker
){
$this
->pool[
$id
]->join();
}
}
public
function
clean(){
foreach
(
$this
->pool
as
$id
=>
$worker
){
if
(!
$worker
->isRunning()){
unset(
$this
->pool[
$id
]);
}
}
}
}
try
{
$dbh
=
new
PDO(
"mysql:host="
.
str_replace
(':', ';port=',
$dbhost
) .
";dbname=$dbname"
,
$dbuser
,
$dbpw
,
array
(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
PDO::MYSQL_ATTR_COMPRESS => true
)
);
$sql
=
"select id,bankno from members order by id desc"
;
$row
=
$dbh
->query(
$sql
);
$pool
=
new
Pool(5);
while
(
$member
=
$row
->fetch(PDO::FETCH_ASSOC))
{
while
(true){
if
(
$pool
->push(
$member
)){
//压入任务到池中
break
;
}
else
{
//如果池已经满,就开始启动线程
$pool
->start();
$pool
->join();
$pool
->clean();
}
}
}
$pool
->start();
$pool
->join();
$dbh
= null;
}
catch
(Exception
$e
) {
echo
'[' ,
date
('H:i:s') , ']', '系统错误',
$e
->getMessage(),
"\n"
;
}
?>
로그인 후 복사 - 스레드 풀의 데이터베이스 연결을 통해 데이터베이스 연결에 액세스합니다. 위 프로그램을 개선하여 싱글톤 모드를 사용합니다. $this->worker->getInstance(); 전역적으로 하나의 데이터베이스 연결만 만들고 스레드는 공유 데이터베이스 연결을 사용합니다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
class
Update
extends
Thread {
public
$running
= false;
public
$row
=
array
();
public
function
__construct(
$row
) {
$this
->row =
$row
;
$this
->sql = null;
//print_r($this->row);
}
public
function
run() {
if
(
strlen
(
$this
->row['bankno']) > 100 ){
$bankno
= safenet_decrypt(
$this
->row['bankno']);
}
else
{
$error
= sprintf(
"%s, %s\r\n"
,
$this
->row['id'],
$this
->row['bankno']);
file_put_contents
(
"bankno_error.log"
,
$error
, FILE_APPEND);
}
if
(
strlen
(
$bankno
) > 7 ){
$sql
= sprintf(
"update members set bankno = '%s' where id = '%s';"
,
$bankno
,
$this
->row['id']);
$this
->sql =
$sql
;
}
printf(
"%s\n"
,
$this
->sql);
}
}
try
{
$dbh
=
new
PDO(
"mysql:host="
.
str_replace
(':', ';port=',
$dbhost
) .
";dbname=$dbname"
,
$dbuser
,
$dbpw
,
array
(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
PDO::MYSQL_ATTR_COMPRESS => true
)
);
$sql
=
"select id,bankno from members order by id desc limit 50"
;
$row
=
$dbh
->query(
$sql
);
$pool
=
array
();
while
(
$member
=
$row
->fetch(PDO::FETCH_ASSOC))
{
$id
=
$member
['id'];
while
(true){
if
(
count
(
$pool
) < 5){
$pool
[
$id
] =
new
Update(
$member
);
$pool
[
$id
]->start();
break
;
}
else
{
foreach
(
$pool
as
$name
=>
$worker
){
if
(!
$worker
->isRunning()){
unset(
$pool
[
$name
]);
}
}
}
}
}
$dbh
= null;
}
catch
(Exception
$e
) {
echo
'【' ,
date
('H:i:s') , '】', '【系统错误】',
$e
->getMessage(),
"\n"
;
}
?>
로그인 후 복사
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$fp
=
fopen
(
"/tmp/lock.txt"
,
"r+"
);
if
(
flock
(
$fp
, LOCK_EX)) {
// 进行排它型锁定
ftruncate(
$fp
, 0);
// truncate file
fwrite(
$fp
,
"Write something here\n"
);
fflush
(
$fp
);
// flush output before releasing the lock
flock
(
$fp
, LOCK_UN);
// 释放锁定
}
else
{
echo
"Couldn't get the lock!"
;
}
fclose(
$fp
);
$fp
=
fopen
('/tmp/lock.txt', 'r+');
if
(!
flock
(
$fp
, LOCK_EX | LOCK_NB)) {
echo
'Unable to obtain lock';
exit
(-1);
}
fclose(
$fp
);
?>
로그인 후 복사권장 학습: "
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
PHP. 비디오 튜토리얼
》위 내용은 PHP pthread를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP는 전자 상거래, 컨텐츠 관리 시스템 및 API 개발에 널리 사용됩니다. 1) 전자 상거래 : 쇼핑 카트 기능 및 지불 처리에 사용됩니다. 2) 컨텐츠 관리 시스템 : 동적 컨텐츠 생성 및 사용자 관리에 사용됩니다. 3) API 개발 : 편안한 API 개발 및 API 보안에 사용됩니다. 성능 최적화 및 모범 사례를 통해 PHP 애플리케이션의 효율성과 유지 보수 성이 향상됩니다.

PHP는 여전히 역동적이며 현대 프로그래밍 분야에서 여전히 중요한 위치를 차지하고 있습니다. 1) PHP의 단순성과 강력한 커뮤니티 지원으로 인해 웹 개발에 널리 사용됩니다. 2) 유연성과 안정성은 웹 양식, 데이터베이스 작업 및 파일 처리를 처리하는 데 탁월합니다. 3) PHP는 지속적으로 발전하고 최적화하며 초보자 및 숙련 된 개발자에게 적합합니다.

PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

PHP는 특히 빠른 개발 및 동적 컨텐츠를 처리하는 데 웹 개발에 적합하지만 데이터 과학 및 엔터프라이즈 수준의 애플리케이션에는 적합하지 않습니다. Python과 비교할 때 PHP는 웹 개발에 더 많은 장점이 있지만 데이터 과학 분야에서는 Python만큼 좋지 않습니다. Java와 비교할 때 PHP는 엔터프라이즈 레벨 애플리케이션에서 더 나빠지지만 웹 개발에서는 더 유연합니다. JavaScript와 비교할 때 PHP는 백엔드 개발에서 더 간결하지만 프론트 엔드 개발에서는 JavaScript만큼 좋지 않습니다.

PHP와 Python은 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구와 개인 선호도에 달려 있습니다. 1.PHP는 대규모 웹 애플리케이션의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 데이터 과학 및 기계 학습 분야를 지배합니다.
