PHP는 매우 큰 프로젝트에 적합합니까? 거래 안전 일 수 있습니까?

StackOverflow https://stackoverflow.com/questions/934236

  •  06-09-2019
  •  | 
  •  

문제

그 질문은 이상하게 보일 수 있습니다.

그러나 과거에 PHP 프로젝트를 만들 때마다 나는 이런 종류의 나쁜 경험을 겪었습니다.

스크립트는 10 초 후에 실행됩니다. 이로 인해 데이터베이스 불일치가 매우 잘못됩니다 (삭제 루프 삭제의 나쁜 예 : 사용자는 사진 앨범을 삭제하려고합니다. 앨범 객체는 데이터베이스에서 삭제 된 다음 사진을 삭제하여 스크립트가 삭제되는 곳에서 삭제됩니다. 10.000 사진에는 참조가 남아 있습니다).

거래 안전이 아닙니다. 나는 무언가를 할 방법을 찾지 못했습니다 안전하게, 그것을 보장하기 위해 완료. 스크립트가 죽으면 죽임을 당합니다. 루프 중간에 바로. 방금 죽입니다. 그것은 Java와 함께 Tomcat에서는 결코 일어나지 않았습니다. Java는 오래 걸리면 달리고 달리고 달려갑니다.

많은 뉴스 레터 스크립트는 작업을 많은 패키지로 나누고, 즉 한 번에 100 개 씩 보내고, 페이지를 다시 옮기고 (오, 정말 바보 같은), 다음을 수행하는 등의 문제를 해결하려고합니다. 대부분 종종 매달려 있거나 스크립트가 10 초 이상 걸리며 플랫폼이 절약됩니다.

그러나 나는 매우 큰 프로젝트가 Studivz (독일 페이스 북 클론, 실제로 가장 큰 독일 웹 사이트)와 같은 PHP를 사용한다고 들었습니다. 따라서이 나쁜 행동은 서버가 너무 나쁘기 때문에 PHP 스크립트를 죽이는 비전문가 호스팅 회사에서 나오는 희망의 작은 빛이 있습니다. 이것에 대한 진실은 무엇입니까? 그런 식으로 구성 할 수 있습니다. 스크립트는 조금 더 오래 걸리기 때문에 결코 죽이지 않습니까?

올바른 솔루션이 없습니다

다른 팁

PHP는 매우 큰 프로젝트에 적합합니까?

그런 질문을 볼 때마다 조금 불안해집니다. 무엇을 하는가 매우 큰 평균? 당신에게 큰 것, 나에게 작거나 그 반대도 마찬가지입니다. 그리고 그것은 우리가 동일한 메트릭을 사용한다고 가정합니다. 프로젝트 구축, 프로젝트의 수명주기, 관련 돈, 사용하는 사람들의 수, 개발자를 구축/유지 관리하는 개발자 등을 측정하고 있습니까?

즉, 당신이 묘사하는 문제는 당신의 기술을 충분히 잘 모르는 것처럼 들립니다. 선택한 기술에 관계없이 문제가 될 것입니다. 예를 들어, 데이터베이스 트랜잭션을 사용하여 원자력을 보장하십시오. 비동기 오프라인 작업을 사용하여 장기 실행 작업 (예 : 메일 링리스트 파견)을 처리합니다.

나쁜 행동이 Zend 프레임 워크와 같은 좋은 프레임 워크로 덮여 있다면 많이. 10 초 더 오래 걸리는 것은 실제로 엉망이되지만 항상 실행 시간을 올릴 수 있습니다. http://de3.php.net/set_time_limit

Facebook, Wikipedia, Studivz, Digg.com 등 PHP에 많은 큰 사이트가 작성됩니다. 당신이 말하는 많은 것들이 단지 구성 일 것입니다.

를 찾습니까 set_time_limit () 그리고 ingore_user_abort ()?

성능은 대부분의 사이트가 완료된 후에 던질 수있는 기능이 아닙니다. 무거운 부하를 위해 사이트를 설계해야합니다.

데이터베이스 작업에 일반적으로 10K 행이 포함 된 경우 실행 시간 문제뿐만 아니라 기타 유지 보수 질문을 준비해야합니다.

  • 최악의 경우 : 일관성 도구를 만들어 오류를 확인하고 수정하십시오.
  • 더 나은 : 이미지를 삭제하는 대신 이미지를 표시하고 백그라운드 서비스로 비싼 기동을 처리하도록하십시오.
  • 최고 : 작업 대기열 서비스를 활용 하고이 작업을 대기열에 추가 할 수 있습니다.

PHP에서 거래를 해야하는 경우 다음을 수행 할 수 있습니다.

mysql_query("BEGIN");

/// do your queries here

mysql_query("COMMIT");

커밋 명령은 트랜잭션을 완료합니다.

오류가 발생하면 다음과 같이 롤백 할 수 있습니다.

mysql_query("ROLLBACK");

편집하다: 참고 이것은 innodb와 같은 트랜잭션을 지원하는 데이터베이스를 사용하는 경우에만 작동합니다.

php.ini 설정 또는 ini_set/set_time_limit를 통해 스크립트를 실행하는 데 허용되는 시간의 양을 구성 할 수 있습니다.

Studivz (독일 Facebook 클론) 대신 PHP 인 실제 Facebook을 볼 수 있습니다. 또는 Digg. 또는 많은 야후 사이트. 또는 많은, 많은 다른.

INGORE_USER_ABORT는 아마도 당신이 찾고있는 것일 것입니다. 그러나 예정된 유지 보수 작업 측면에서 다른 계층을 추가 할 수도 있습니다. 그들은 기본적으로 지정된 간격으로 실행되며 데이터/파일 시스템이 원하는 상태인지 확인하기 위해 다양한 작업을 수행합니다. 오래된/무제한 파일을 삭제하는 것은 할 수있는 많은 일 중 하나 일뿐입니다.

사진 앨범 삭제 또는 1000의 이메일 보내기와 같은이 큰 루프의 경우 ingore_user_abort 및 set_time_limit을 찾고 있습니다.
이 같은:

ignore_user_abort(true); //users leaves webpage will not kill script
set_time_limit(0); //script can take as long as it wants
for(i=0;i<10000;i++)
 costly_very_important_operation();

그러나 이것은 잠재적으로 스크립트를 영원히 실행할 수 있음을 조심하십시오.

ignore_user_abort(true); //users leaves webpage will not kill script
set_time_limit(0); //script can take as long as it wants
while(true)
  do_something();

서버를 다시 시작하지 않으면 해당 스크립트는 죽지 않습니다.

따라서 time_limit을 0을 설정하지 않는 것이 가장 좋습니다.

기술적으로 프로그래밍 언어는 트랜잭션 안전하지 않습니다. 거래 안전이 필요한 데이터베이스입니다. 따라서 실행중인 스크립트/코드가 사라지거나 연결이 끊어지면 어떤 이유로 든 트랜잭션이 롤백됩니다.

쿼리를 루프에 넣는 것은 특히 배치로 작동하고 훨씬 더 큰 세트를 작은 조각으로 나누는 것이 아니라면 매우 나쁜 생각입니다. PHP 타이머 및 한계 조정은 일반적으로 정지 갭 솔루션입니다. 웹을 사용하여 스크립트를 시작하는 경우에도 클라이언트 브라우저에 여전히 의존합니다.

브라우저에서 시작 해야하는 긴 프로세스가있는 경우 브라우저와 웹 서버에서 프로세스를 "분리"하여 스크립트가 실행되는 동안 제어가 사용자에게 반환됩니다. 명령 줄에서 실행되는 PHP 스크립트는 원하는 경우 몇 시간 동안 실행할 수 있습니다. 그런 다음 AJAX를 사용하거나 페이지를 다시로드하여 장기 실행 스크립트의 진행 상황을 확인할 수 있습니다.

이 코드에는 보안 문제가 있지만 Apache와 같은 Shove에서 실행되는 PHP의 프로세스를 "분리"하는 것입니다.

exec("nohup /usr/bin/php -f /path/to/script.php > /dev/null 2>&1 &");

그러나 그것은 PHP가 대규모 프로젝트에 적합하거나 거래 안전에 적합한 것과 관련이 없습니다. PHP는 대규모 프로젝트에 사용될 수 있지만 기본적으로 히트 사이에 "거주"로 유지되는 코드는 없으므로 제대로 설계되지 않으면 느리게 될 수 있습니다. 또한 네임 스페이스 지원이 없으므로 대규모 개발 팀이 있으면 미리 계획하고 싶습니다.

Java 기반 시스템이 모든 기본 객체를 시작하고 초기화하고로드하는 데 몇 분이 걸리는 것이 좋습니다. 그러나 이것은 PHP에서 용납 할 수 없습니다. PHP는 더 큰 시스템을 위해 더 많은 계획을 세울 것입니다. 문제는 대규모 시스템에 필요한 추가 계획 시간으로 PHP를 사용하는 데 필요한 시간이 언제 낭비됩니까?

과거에 잘못된 데이터베이스 일관성을 경험했을 가능성이 가장 높은 이유는 MySQL에 MyISAM 엔진을 사용했기 때문입니다 (트랜잭션을 지원하지 않음). 대신 innodb를 사용하면 트랜잭션을 지원하고 행 레벨 잠금을 수행합니다. 또는 postgresql을 사용하십시오.

많은 소프트웨어 사이트가 PHP로 만들어집니다. 그러나 PHP에서 만들어진 수백만 개의 웹 페이지에 대해서는 더 이상 버려 졌기 때문에 존재하지 않는 웹 페이지에 대해 듣지 못할 것입니다. 이 페이지는 PHP 혼란을 다루기 위해 모든 회사의 돈을 태웠거나 고객의 소프트가 너무 엉망이되어 고객이 원하지 않았기 때문에 파산했을 수도 있습니다. 예, PHP에는 많은 거대한 웹 사이트가 있지만 표준보다는 예외입니다.

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