문제

저는 주로 Java, C 및 C ++에 대해 주로 친숙하며, 여기서 하나의 스레드 만 주어진 시간에 리소스에 액세스하고 있다는 것을 제어 할 수있는 방법이 있습니다. 이제 나는 비슷한 것을 찾고 있지만 PHP 5.X에서.

한 예로 내 문제를 공식화하려면 다음과 같습니다.

페이지로드 카운터의 값 만 저장하는 ASCII-File이 있습니다. 애플리케이션 배포시 파일은 단순히 0을 유지합니다. 각 액세스마다 값은 값이 증가합니다. 목표는 페이지로드를 추적하는 것입니다.

많은 사용자가 동시에 카운터가 포함 된 페이지에 액세스 할 때 문제가 발생합니다. 스레드 A가 현재 값을 읽었을 때, 11이라고 가정 해 봅시다. 우리가 B라고 부르는 다른 스레드는 여전히 값을 읽습니다. 그 다음 첫 번째 스레드 A는 읽기 값을 증가시키고 파일에 12를 씁니다. 그런 다음 두 번째 스레드 B는 11 인 읽기 값을 증가시켜 12를 가져 와서 파일에 씁니다. 값 12는 실제로 13 일이었을 때 파일에 저장됩니다.

다른 프로그래밍 언어에서는 뮤텍스를 사용하여 이것을 해결했을 것입니다. 모듈의 일부로 뮤텍스, 공유 메모리 및 기타 기능성이 있음을 이해합니다. 그러나 나는 "대부분의 서버"에서 작동하는 솔루션을 원합니다. 플랫폼 독립. 가장 저렴한 웹 호스트에 설치되었습니다. 이 문제에 대한 좋은 해결책이 있습니까? 그리고 없다면, 당신은 데이터베이스는 옵션이 아닙니다?

도움이 되었습니까?

해결책

PHP의 플록 변형을 시도 할 수 있습니다 (http://www.php.net/flock)

나는 (/tmp/counter.txt 파일이 이미 존재하고 파일에 카운터가 있다고 가정)와 비슷한 것을 상상합니다.

<?php

$fp = fopen("/tmp/counter.txt", "r+");

echo "Attempt to lock\n";
if (flock($fp, LOCK_EX)) {
  echo "Locked\n";
  // Read current value of the counter and increment
  $cntr = fread($fp, 80);
  $cntr = intval($cntr) + 1;

  // Pause to prove that race condition doesn't exist
  sleep(5);

  // Write new value to the file
  ftruncate($fp, 0);
  fseek($fp, 0, SEEK_SET);
  fwrite($fp, $cntr);
  flock($fp, LOCK_UN); // release the lock
  fclose($fp);
}

?>

다른 팁

PHP의 Flock () 함수는 이동 경로입니다. 그러나, 당신은 그것을 확인해야합니다 모두 파일에 대한 액세스는 Flock ()에 대한 호출에 의해 보호됩니다. PHP는 명시 적으로 전화를 걸지 않는 한 파일이 잠겨 있는지 확인하지 않습니다.

이 개념은 뮤텍스 (공유 자원 보호 등)와 거의 동일하지만 특별한 강조를하는 것은 충분히 중요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top