php threads 질문 입니다. child 에서 parent 로 값을 넘겨주고자 합니다.

송효진의 이미지

<?php

function runChild($n) {
	global $a;
	$o_pid = posix_getpid();
	$pid = pcntl_fork();
	if($pid == -1) {
		echo "oops\n";
		exit;
	}
	$n_pid = posix_getpid();
	if($o_pid == $n_pid) {
		return true;
	}
	
	sleep(mt_rand(1,5));
	file_get_contents('http://kr.yahoo.com');
	echo "{$a[$n]} : $n : get it\n\n";
	$a[$n] = 1;
	exit;
}

$a[0] = 0;
$a[1] = 0;
$a[2] = 0;

runChild(0);
runChild(1);
runChild(2);

while($a[0] == 0 || $a[1] == 0 || $a[2] == 0) {
	sleep(1);
}

echo "not exited\n";

?>

runChild() 에서 $a[$n] 에 1 을 넣어도 parent 에서 적용되지 않아
while 문을 빠져나오지 못합니다.

shmop 으로 어떻게 해보려 했는데,
ftok() 사용 방법을 보고 생각을 접었습니다.
한 파일에 255 개 생성하는게 한계군요.
255개 이상 만들것을 고려해야 합니다.

sharedmem 옵션으로 컴파일 하면 컴파일이 안되는것도 문제군요.

php 로 쓰레드를 하려는 이유는 소켓통신 부분이 너무 느려서,
한번에 3개 정도의 프로세스를 돌리고자 함입니다.

그러니까 계속 떠 있는게 아니고 프로세스 3개가 동시에 동작하고 값을 반환하고 바로 종료되면 됩니다.
이런 작업을 하는 프로세스가 굉장히 많을겁니다.

값을 반환해줄 방법이 뭐가 있을까요?

제가 쓰레드를 처음 접해보는게 가장 큰 문제일지도 모르겠습니다.

송효진의 이미지

php 에서 공유메모리를 쉽게 사용할 수 있는
확장함수 같은거 없을까요?

sh.의 이미지

다른건 잘 모르겠지만.. http://pear.php.net/package/System_SharedMemory 가 혹시 도움이 될까싶어 올려봅니다. 아직 베타입니다.

그런데 지금 작성하시는게 쓰레드는 아니고 그냥 프로세스 새끼치는것같은데요. 학교다닐때 숙제냈던거랑 비슷하네요.

익명 사용자의 이미지

송효진 wrote:

ftok() 사용 방법을 보고 생각을 접었습니다.
한 파일에 255 개 생성하는게 한계군요.
255개 이상 만들것을 고려해야 합니다.

ftok를 안 쓰고 그냥 int 을 써보세요.

Quote:

sharedmem 옵션으로 컴파일 하면 컴파일이 안되는것도 문제군요.

아마 옵션에 문제가 ...

--enable-shmop
--enable-sysvmsg
--enable-sysvsem
--enable-sysvshm
참고 하세요. 안 될 때 메세지는요?

Quote:

php 로 쓰레드를 하려는 이유는 소켓통신 부분이 너무 느려서,

stream으로 해 보셨어요?

Quote:

값을 반환해줄 방법이 뭐가 있을까요?

msg_send, msg_receive 같은 걸 쓰면 될 것 같습니다.
송효진의 이미지

아우....
자식을 만들면 아파치 소켓이 자식으로 넘어가고,
자식이 죽으면 브라우저와의 통신이 끊기네요.

아파치 영향 안받으면서 자식 만드는 방법이 있을까요?

kyong의 이미지

송효진 wrote:
아우....
자식을 만들면 아파치 소켓이 자식으로 넘어가고,
자식이 죽으면 브라우저와의 통신이 끊기네요.

아파치 영향 안받으면서 자식 만드는 방법이 있을까요?


--enable-sigchild Enable PHP's own SIGCHLD handler
하셨어요?
송효진의 이미지

같은증상이네요.

부모가 죽기전에 자식이 안죽도록 무한루프라도 돌려봐야 겠습니다.
시험삼아 자식 exit 전에 sleep 걸어서 부모가 먼저 echo 하고 끝나게 하면,
부모의 메세지만 출력하고 종료되는군요.
이걸로 어찌해봐야 겠습니다.

keepalive On 으로 되어 있으면,
다음 쿼리에 문제가 생기는군요.
할 수 없는건가...

maximus의 이미지

뭐 하시는거겠지만 그냥 속편하게 mysql 에 ram table (맞나?) 만들어서 사용하시는 어떨지요 ?

=================================
:: how about a cup of tea ? ::
=================================

송효진의 이미지

maximus wrote:
뭐 하시는거겠지만 그냥 속편하게 mysql 에 ram table (맞나?) 만들어서 사용하시는 어떨지요 ?

현재의 문제점은 데이터공유가 아니고,
동시에 3가지 일을 처리하려고 자식을 만들었더니,
자식들이 브라우저의 아파치 연결에 같이 붙어버리는 것이 문제거든요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.