배경 : PHP로 웹 사이트를 구축하고 있는데 웹 사이트에서 Ruby 1.9로 작성된 스크립트를 호출하도록해야합니다. 이미 Ruby 1.8이 설치된 CentOS 5.10 서버를 사용하고 있으며 RVM을 사용하여 Ruby 1.9로 업그레이드했습니다. ruby --version
명령 줄에서 입력하면 예상대로 Ruby 1.9가 설치되어 있다고 표시됩니다. 그러나 PHP를 사용하여을 호출 exec('ruby --version');
하면 Ruby 1.8이 설치되어 있다고 표시됩니다. 또한 PHP를 사용하여를 호출 exec('which rvm');
하면 RVM이 설치되어 있음을 알고 있어도 아무것도 반환하지 않습니다.
질문 : PHP가 Ruby 1.8의 시스템 설치 대신 Ruby 1.9의 RVM 설치를 사용하도록 허용하려면 어떻게해야합니까?
PHP 스크립트를 실행하는 웹 서버 프로세스를 실행 하는 사용자는 명령 줄을 사용할 때 사용자와 다르다는 점을 기억하는 것이 중요합니다 . 이를 확인하기 위해 다음과 같은 PHP 스크립트를 생성 할 수 있습니다.
<?php
print exec('whoami');
명령 줄에서 직접 스크립트를 실행하면 사용자 이름이 표시됩니다. 웹 접근 폴더에 해당 스크립트를 넣고 (예 : 웹 브라우저를 통해 실행 http://localhost/whoami.php
), 당신은 아마 같은 이름을 볼 수 있습니다 apache
또는 www-data
.
또한 명령 줄과 웹 브라우저에서 실행중인 Ruby를 비교할 수도 있습니다. 다음 PHP 스크립트를 사용하십시오.
<?php
print exec('which ruby');
명령 줄에서 실행 한 다음 웹 브라우저에서도 실행하십시오. 두 개의 다른 위치가 있어야합니다. 물론 이것이 핵심 문제입니다.
rvm을 설치할 때 홈 폴더 의 .bash_profile
또는 .profile
파일에 코드 줄이 추가되었을 수 있습니다 . 다음과 유사한 줄이 있는지 확인하려면 해당 파일의 끝 부분을 살펴보십시오.
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
이 행은 rvm에 액세스 할 수 있도록 로그인하거나 터미널을 열 때마다 쉘 환경을 초기화합니다. 이를 확인하기 위해 다음을 사용하여 php 파일을 생성 할 수 있습니다.
<?php
print exec('env | grep rvm');
명령 줄에서, 몸과 같이이 실행, 당신은 관련 라인이 표시되어야 rvm_bin_path
하고 rvm_path
다른 사람을. 그러나이 스크립트를 웹에서 액세스 할 수있는 폴더에 넣고 브라우저에서 실행하면 해당 행이 브라우저에 출력되지 않습니다. 이는 PHP 프로세스가 생성 하는 셸 이 www-data
사용자 (또는 웹 서버가 실행되는 사용자)로 실행할 때 `.bash_profile
스크립트에 있는 것과 동일한 rvm 초기화 행을 갖지 않기 때문 입니다.
이 문제를 해결하는 한 가지 가능한 방법은 PHP에서 올바른 환경 변수를 설정하여 exec
호출 될 때 rvm 관련 항목 (예 : Ruby 버전 설정)을 실행하기 위해 이미 적절하게 초기화 된 환경 내에서 호출되도록하는 것입니다. 그러나 대부분의 경우 PHP 스크립트에서 이러한 환경 변수를 설정하지 못하도록하는 특정 safe_mode 보호가 PHP에 있습니다.
약간의 해킹 인 다른 해결책은 브라우저의 PHP 스크립트 가 명령 줄에서 실행하는 것과 동일한 루비 인터프리터를 실행하도록 하는 것입니다. 즉, 대신에 exec('ruby some_ruby_file.rb')
할 것 exec('/home/my_username/.rvm/rubies/ruby-1.9/bin/ruby some_ruby_file.rb')
입니다. 루비 인터프리터에 대한 경로를 방금 만들었습니다. 명령 줄에서 실행 which ruby
하여 루비 인터프리터의 정확한 경로를 찾으십시오. 하지만www-data
폴더에서이 루비 인터프리터를 실행할 수있는 권한이 있는지 확인 해야합니다. 이 번거 로움을 피하기 위해 이것은 심지어 해킹에 가깝지만 단순히 해당 루비 인터프리터의 복사본을 만들어에서 소유 한 bin 폴더에 배치하고 루비 인터프리터가되는 www-data
PHP 스크립트를 사용 exec
하는 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다