Dev Blog

스크립트 & 소스코드 공유

실무에서 유용하게 쓰는 스크립트와 코드 조각을 블로그 게시판으로 저장하고 공유합니다.

26건의 글

Nginx+PHP-FPM에서 .html 파일에서 PHP 코드 실행하기

Nginx 환경에서 .html·.htm 파일에서도 PHP 코드가 실행되도록 설정하는 방법이다. /www/server/nginx/conf의 enable-php-74.conf에서 location 정규식 매칭에 html·htm을 추가하고, /www/server/php/74/etc/php-fpm.conf의 security.limit_extensions에 .html·.htm 확장자를 등록한 뒤 저장하면 된다.

第一步:修改 Nginx 引用文件 (针对 7.4)​

由于你换了版本,Nginx 现在引用的应该是 enable-php-74.conf

  1. 进入目录:/www/server/nginx/conf/
  2. 找到并打开文件:enable-php-74.conf
  3. 将其内容修改为(注意第一行加入了 htmlhtm):
location ~ [^/]\.(php|php5|html|htm)(/|$)
    {
        try_files $uri =404;
        fastcgi_pass  unix:/tmp/php-cgi-74.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
        include pathinfo.conf;
    }
第二步:修改 PHP-7.4 的安全后缀限制
  1. 进入宝塔面板 -> 文件。
  2. 直接进入这个路径:/www/server/php/74/etc/
  3. 找到文件:php-fpm.conf 并双击打开。
  4. 在这个文件里搜索 [www](通常就在文件开头或中部)。
  5. 在 [www] 下方添加: security.limit_extensions = .php .php3 .php4 .php5 .php7 .html .htm
  6. 保存。

그누보드 메일이 발송되지 않을 때 - SMTP 설정 방법

그누보드에서 메일이 정상적으로 발송되지 않을 때 네이버 SMTP로 보내는 설정 방법이다. /lib/mailer.lib.php에서 G5_SMTP 관련 부분을 주석 처리하고, $mail->IsSMTP(), SMTPSecure = "ssl", Host = smtp.naver.com, Port = 465, 네이버 계정의 Username과 Password를 직접 입력한다. 네이버 메일의 POP3/IMAP 설정 안내에서 값을 확인할 수 있다.

닷X 무료 호스팅과 네이버 SMTP를 기준으로 테스트한 것입니다.
우선 /lib/mailer.lib.php 파일을 여신 후에

/*
if (defined('G5_SMTP') && G5_SMTP) {
$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host = G5_SMTP; // SMTP server
if(defined('G5_SMTP_PORT') && G5_SMTP_PORT)
$mail->Port = G5_SMTP_PORT;
}
*/

이렇게 된 부분이 있습니다.
주석으로 막으셔도 되고 위에 써 있는 상수(config.php)를 직접 수정하셔도 됩니다.
계정 정보를 입력해야 하고 ssl, auth 이런 것들 때문에 저는 주석으로 막고 이 파일을 그냥 수정했습니다.

아래 부분을 주석으로 막은 바로 밑에 붙여 넣으시면 됩니다.

$mail->IsSMTP();
$mail->SMTPDebug = 2;
$mail->SMTPSecure = "ssl";
$mail->SMTPAuth = true;
$mail->Host = "smtp.naver.com";
$mail->Port = 465;
$mail->Username = "naver id";
$mail->Password = "naver password";

//여기에서 수정하셔야 할 것은

$mail->Host = "smtp.naver.com";
$mail->Port = 465;
$mail->Username = "naver id";
$mail->Password = "naver password";

이 네 가집니다.

위 값은 SMTP를 제공해 주는 메일 계정에 보면 다 나옵니다.
네이버를 기준으로 하였으니 네이버 메일로 접속하신 후 좌측 하단에 보면 '외부메일 가져오기'라고 된 부분이 있습니다.
클릭하신 후에 POP3/IMAP 설정을 들어가세요.
그러면 가장 하단에 '메일 프로그램 환경 설정 안내' 부분이 있습니다.
여기에 있는 정보를 그대로 위 네 가지에 넣어 주시면 됩니다.

그리고 나서 실행해 보세요.

혹시 몰라 mailer.lib.php 파일 첨부합니다.

mailer("테스트", "보내는 사람", "받는 사람", "대출 문의", "내용입니다.");
실제로 위 함수를 실행할 때 보내는 사람 메일 주소는 smtp 계정에서 사용하는 메일 주소를 넣으셔야 합니다.
예를 들어서 나는 개인정보보호를 위한 이메일주소 노출방지 으로 해야만 발송이 된다는 겁니다.

PHP simplexml로 XML 파일 파싱하기

PHP의 simplexml_load_file 함수로 XML 파일을 읽어 특정 노드 값을 가져오는 방법이다. 그누보드 환경에서 cd_catalog.xml 파일을 로드하고, $xml->CD[1]->TITLE처럼 객체 경로로 접근해 원하는 요소의 데이터를 출력하는 예제를 보여준다. XML 파싱 결과를 확인하는 print_r2 활용법도 포함한다.

<?
include_once('./_common.php');

$xmlfile = "./cd_catalog.xml";
$xml = simplexml_load_file($xmlfile);

$data = $xml->CD[1]->TITLE;
echo $data;
print_r2($xml);
?>

PHP 엑셀 업로드 시 날짜·시간 변환 함수

PHP에서 엑셀 파일을 업로드할 때 날짜/시간 값을 일반 날짜 형식으로 변환하는 함수 excelformatTime()을 소개한다. 값에 '-'가 포함된 문자열이면 strtotime으로 변환하고, 그렇지 않은 엑셀 시리얼 숫자면 기준값 25569에서 (값-25569)*3600*24로 환산해 Y-m-d H:i:s 형식으로 반환한다.

function excelformatTime($timevalue){

if(strpos($timevalue,"-")){
$time =  strtotime($timevalue);
}else{
$time =  intval(($timevalue- 25569) * 3600 * 24);
}
return date('Y-m-d H:i:s', $time);
}

PHP file_get_contents HTTP request failed 오류 해결하기

PHP의 file_get_contents나 readfile로 원격 파일을 읽을 때 발생하는 "failed to open stream: HTTP request failed!" 오류를 해결하는 방법이다. php.ini에서 allow_url_fopen을 On으로 설정하고 user_agent를 Mozilla 값으로 바꾸는 방법, 그리고 반복 호출 시에도 안정적인 cURL 기반 대체 코드를 정리했다.

当使用php5自带的file_get_contents方法来获取远程文件的时候,有时候会出现file_get_contents(): failed to open stream: HTTP request failed!这个警告信息。

google或者baidu一下,好多这样的问题,解决的方法都是修改php.ini,把allow_url_fopen给启用,改成 allow_url_fopen = On

这样做可以解决某些人的问题,有人说在php.ini中,有这样两个选项:allow_url_fopen =on(表示可以通过url打开远程文件),user_agent="PHP"(表示通过哪种脚本访问网络,默认前面有个 " ; " 去掉即可。)重启服务器。

但是有些还是会有这个警告信息,想用完美的解决还差一步,还得设置php.ini里面的user_agent,php默认的user_agent是PHP,我们把它改成Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)来模拟浏览器就可以了

user_agent=”Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)”

在工作中遇到这个问题,后完美解决,故分享给大家。

我批量抓取chemblink的结构式发现循环后有部分图片无法显示,而远程文件是存在的。

抓取远程文件的时候出现类似Warning: readfile(http://www.php100.com/logo.gif)) [function.readfile]: failed to open stream: HTTP request failed! 这样的警告信息,我使用的是

ob_start();

readfile("http://www.php100.com/logo.gif");

$img = ob_get_contents();

ob_end_clean();

这样在运行中会时不时的出现上述错误,我也换过file_get_contents等其他函数都没用用,在网上查阅后发现用CURL方法抓取不会出错

$url = "http://www.php100.com/logo.gif";

$ch = curl_init();

curl_setopt ($ch, CURLOPT_URL, $url);

curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10);

$img = curl_exec($ch);



Let's create something great together.

프로젝트 문의 및 견적 요청은 언제든 환영합니다.