PHP 에서 DirectIO 작업 파일 확장 방법
Direct IO 가 뭐야?
Direct IO 는 사실 Linux 운영 체제 의 한 개념 이다.파일 흐름 을 직접 조작 한 다 는 뜻 인 데 왜 직접 이 라 고 하 죠?사실 우리 운영 체제 에서 파일 작업 을 할 때 바로 디스크 에 파일 을 읽 고 쓰 는 것 이 아니 라 중간 에 페이지 캐 시가 있 습 니 다.캐 시 라면 물론 성능 향상 을 가 져 올 수 있 지만 절대적 인 것 은 아니다.직접 작업 은 이 층 의 캐 시 작업 을 무시 하고 디스크 에 있 는 파일 을 읽 고 쓰 는 것 입 니 다.디스크 는 고체 하 드 디스크 라 도 CPU 와 메모리 의 처리 속도 사이 에 큰 차이 가 있다 는 것 을 잘 알 고 있 습 니 다.기본 페이지 캐 시 는 이러한 차 이 를 메 우 는 데 사 용 됩 니 다.그러나 페이지 캐 시 는 CPU 의 연산 작업 과 메모리 점용 을 증가 시 키 고 직접 조작 하 는 데 는 문제 가 없 지만 상대 적 으로 캐 시 가 있 는 파일 읽 기 작업 과 비교 할 수 없습니다.
이상 은 Direct IO 에 대한 간단 한 이해 이 고 상세 한 설명 은 문서 의 두 번 째 링크 내용 을 참고 하여 깊이 있 는 학습 을 할 수 있 습 니 다.PHP 에서 저 희 는 PECL 에서 Direct IO 확장 을 직접 다운로드 하면 확 장 된 정상 적 인 설치 방식 에 따라 설치 할 수 있 습 니 다.
쓰기 파일 만 들 기
파일 작업 이 라면 우선 파일 데 이 터 를 만 들 고 기록 하 는 것 이 좋 습 니 다.
$fd = dio_open("./test", O_RDWR | O_CREAT);
echo dio_write($fd, "This is Test.I'm ZyBlog.Show me the money4i"), PHP_EOL;
// 43
print_r(dio_stat($fd));
// Array
// (
// [device] => 64768
// [inode] => 652548
// [mode] => 35432
// [nlink] => 1
// [uid] => 0
// [gid] => 0
// [device_type] => 0
// [size] => 43
// [block_size] => 4096
// [blocks] => 8
// [atime] => 1602643459
// [mtime] => 1602656963
// [ctime] => 1602656963
// )
dio_close($fd);
f 시리즈 의 함수 와 유사 합 니 다.우 리 는 dio 를 사용 해 야 합 니 다.open()함수 로 파일 을 엽 니 다.ORDWR | O_CREAT 매개 변 수 는 읽 기와 쓰기 파일 을 열 고 파일 이 존재 하지 않 으 면 만 든 다 는 뜻 입 니 다.이 두 상 수 는 리 눅 스에 서 관련 된 직접 작업 파일 의 상수 와 대응 하 며,글 끝의 링크 에서 도 이러한 상수 에 대한 설명 을 볼 수 있다.쓰기 동작 도 하나의 dio 를 사용 합 니 다.write()를 완성 할 수 있 습 니 다.되 돌아 오 는 내용 은 기 록 된 내용 의 길이 입 니 다.여기에 43 자 를 썼 습 니 다.
dio_stat()는 현재 파일 핸들 을 되 돌려 주 는 정보 입 니 다.장치 번호 device,uid,gid,atime,mtime 등 일부 정 보 를 볼 수 있 습 니 다.이것 은 우리 가 Linux 에서 볼 수 있 는 정보 와 유사 합 니 다.사실은 이 파일 의 간단 한 정보 입 니 다.
파일 읽 기
파일 읽 기 는 매우 간단 한 함 수 를 사용 하면 완성 할 수 있 습 니 다.
$fd = dio_open("./test", O_RDWR | O_CREAT);
echo dio_read($fd), PHP_EOL;
// This is Test.I'm ZyBlog.Show me the money4i
dio_close($fd);
dio_read()함 수 는 또 다른 매개 변 수 를 포함 하고 있 습 니 다.지정 한 바이트 길이 로 내용 을 읽 을 수 있 습 니 다.이것 은 뒤에서 관련 된 예제 도 볼 수 있 습 니 다.파일 조작
파일 을 읽 는 과정 에서 우 리 는 일부분 의 내용 만 읽 거나 특정한 위치 에서 파일 내용 을 읽 기 시작 할 수 있 습 니 다.아래 의 조작 함 수 는 이 두 가지 측면 에 대해 조작 한 것 입 니 다.
$fd = dio_open("./test", O_RDWR | O_CREAT);
var_dump(dio_truncate ($fd , 20));
// bool(true)
echo dio_read($fd), PHP_EOL;
// This is Test.I'm ZyB
dio_seek($fd, 3);
echo dio_read($fd), PHP_EOL;
// s is Test.I'm ZyB
dio_close($fd);
사실 이름 만 봐 도 diotruncate()는 파일 내용 을 차단 하 는 데 사 용 됩 니 다.여기 서 우 리 는 20 번 째 문자 에서 절단 한 후에 dio 를 사용 합 니 다.read()가 읽 은 내용 은 20 글자 의 내용 에 불과 합 니 다.dio_seek()는 어떤 문자 부터 내용 을 읽 을 지 지정 합 니 다.시작 문자 의 위 치 를 3 으로 지정 하면 앞의 세 문 자 는 읽 히 지 않 습 니 다.주의해 야 할 것 은,diotruncate()는 원본 파일 의 내용 을 수정 하고 dioseek()는 수정 하지 않 습 니 다.
기타 설정
$fd = dio_open('./test', O_RDWR | O_NOCTTY | O_NONBLOCK);
dio_fcntl($fd, F_SETFL, O_SYNC);
dio_tcsetattr($fd, array(
'baud' => 9600,
'bits' => 8,
'stop' => 1,
'parity' => 0
));
while (($data = dio_read($fd, 4))!=false) {
echo $data, PHP_EOL;
}
// This
// is
// Test
// .I'm
// ZyB
dio_close($fd);
dio_fcntl()함 수 는 호출 된 c 함수 라 이브 러 리 의 fcntl 함수 입 니 다.파일 설명자 에 대해 지정 한 작업 을 수행 하 는 것 이 목적 입 니 다.이 작업 도 상수 로 고정 되 어 있 습 니 다.여기 서 우리 가 사용 하 는 것 은 F 입 니 다.SETFL,파일 설명자 로 고 를 지정 한 값 으로 설정 한 다 는 뜻 입 니 다.이 OSYNC 는 이 설명 자 를 설정 하면 이 파일 에 대한 쓰기 디스크 는 데이터 가 디스크 에 기 록 될 때 까지 기다 릴 것 이 라 고 밝 혔 다.물론 이 함 수 는 다른 조작 자 를 많이 설정 할 수 있 습 니 다.여러분 은 PHP 의 공식 문 서 를 참고 하여 깊이 있 게 공부 할 수 있 습 니 다.dio_tcsetattr()는 파일 을 여 는 터미널 속성 과 포트 율 을 설정 하 는 데 사 용 됩 니 다.baud 는 포트 율 을 나타 내 고 bits 는 위 치 를 나타 내 며 stop 은 정지 위 치 를 나타 내 고 parity 는 패 리 티 검사 위 치 를 나타 낸다.이 방면 의 내용 에 대해 서 는 과 중의 일부 지식 이 필요 하 다.나 도 잘 모 르 기 때문에 상세 하 게 설명 하지 않 을 것 이다.여기 서 알 수 있 듯 이 대학 수업 의 기초 과정 은 정말 매우 중요 하 다.이런 전공 기초 과정 을 잘 배 운 학생 들 은 반드시 이 함수 의 역할 을 바로 이해 할 수 있 을 것 이 라 고 믿는다.
마지막 으로 우 리 는 dioread()에 서 는 두 번 째 매개 변 수 를 사용 하여 바이트 길이 에 따라 파일 내용 을 읽 었 습 니 다.읽 은 내용 은 4 글자 길이 단위 의 출력 입 니 다.
총결산
함수 의 학습 은 비교적 간단 하 다.핵심 적 인 것 은 이 확장 이 어떤 업무 장면 에서 더욱 적합 한 지 알 아야 한다.글 의 시작 부분 에 대한 소개 에서 우 리 는 파일 을 직접 조작 하 는 것 과 일반 파일 을 조작 하 는 것 의 차이 점 을 설명 했다.캐 시 응용 프로그램 이나 매우 큰 데 이 터 를 전송 해 야 할 때 직접 조작 하 는 것 은 CPU 와 메모리 에 더욱 우호 적 이다.다른 경우 에는 시스템 의 기본 파일 조작 방식 을 사용 하면 됩 니 다.사실 대부분의 상황 에서 우 리 는 그것들의 현저 한 차 이 를 거의 알 아 볼 수 없다.그래서 실제 응용 에서 도 그 말 은 업무 의 실제 상황 과 결합 하여 가장 좋 은 방안 을 선택한다.
테스트 코드:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/4.PHP중 DirectIO 직 결 파일 확장 사용.php
참고 문서:
https://www.php.net/manual/zh/book.dio.php
https://www.ibm.com/developerworks/cn/linux/l-cn-directio/
PHP 에서 DirectIO 직 결 파일 확장 에 사용 되 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 phop 확장 에 관 한 사용 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.