programing

PHP interafce mysql()은 동작하지 않지만 mysqli()는 동작합니다.왜일까요?

luckcodes 2023. 1. 21. 10:19

PHP interafce mysql()은 동작하지 않지만 mysqli()는 동작합니다.왜일까요?

개요: 덤프/복원 후 웹 앱에서 마리아DB에 더 이상 연결할 수 없습니다.이는 MariaDB에서 PHP mysql() 인터페이스와 mysqli() 인터페이스가 처리되는 방법 간의 차이인 것 같습니다.

MacOS X 10.6.8(Snow Leopard), PHP 5.3.8 및 Apache 2.2.24의 MariaDB 10.1.8.

디스크 드라이브 장애로 인해 일부 InnoDB 테이블에 액세스할 수 없게 되어 서버가 크래시되는 '데이터베이스 부패'가 발생했습니다.서버 에러 로그의 엔트리가 나타내는 Web 페이지의 지시에 따라서, 「mysqld --innodb_force_recovery=2」를 사용해 읽기 전용으로 실행할 수 있었습니다(레벨 1은 크래쉬 해, 레벨 3은 시도하지 않았습니다).

"force_recovery" 모드에서 모든 데이터베이스(11GB)의 논리(SQL 코드) 덤프를 수행하고 장애가 있는 데이터 디렉토리의 이름을 변경한 후 "scripts/mysql_install_db.sh"를 실행하여 빈 데이터 디렉토리를 초기화했습니다.그런 다음 사소한 문제만 안고 논리 백업을 로드했습니다.

이제 혼란스러워진다.mysql CLI, phpMyAdmin, Sequel Pro, Valentia 등 다양한 툴을 사용하여 데이터베이스에 정상적으로 액세스할 수 있습니다.

그러나 여러 버전의 MediaWiki와 여러 개의 자체 이미지 기반 인스턴스를 포함하여 호스팅하는 웹 사이트를 통해 데이터베이스에 액세스할 수 없습니다.mysql_connect()에서는 mysql CLI를 통해 동작하는 로그인 credential에 의해 실패합니다.그러나 phpMyAdmin은 동일한 로그인 자격 정보를 사용하여 작동합니다.

그래서 저는 phpMyAdmirn 코드를 탐색하여 mysqli()를 사용하고 있는 것을 발견했습니다만, 고장난 웹 앱은 mysqli()를 사용하고 있는 것 같습니다.phMyAdmin은 이것을 제어하는 설정 변수를 가지고 있습니다.mysqli에서 mysql로 변경했습니다.다시 "mysqli"로 변경했고 다시 작동합니다.

PHP 코드는 변경하지 않았습니다.아파치 설정은 변경하지 않았습니다./etc/my.cnf는 변경하지 않았습니다./etc/php.ini는 변경하지 않았습니다.로그인 자격 정보는 변경되지 않았습니다.변경된 것은 덤프, 재초기화 및 모든 데이터베이스 복원뿐입니다.

MySQL 시스템 변수 설정에 따라서는 덤프/복원 사이클이 완료되지 않았을 수 있습니다.

phpinfo()는 mysqli()가 적절한 소켓인 /tmp/mysql.sock을 사용하지만 mysql()은 /etc/php.ini에서 활성화되지 않은 /var/mysql/mysql.sock을 사용하고 있음을 나타냅니다./var/mysql에는 /tmp/mysql.sock을 가리키는 심볼링크가 있었습니다.이러한 링크는 제가 전에 이 경로를 따라갔던 것 같습니다.나는 그것을 연결하기 위해 노력했지만, 여전히 즐겁지 않았다.

"php -info"를 실행했는데 컴파일된 소켓은 실제로 /var/mysql/mysql.sock입니다.그래서 /etc/my.cnf에 "symplink=/var/symplink/symplink."를 넣고 /var/symplink를 삭제하고 mysql과 apache를 모두 재시작했습니다.소켓은 /var/mysql에 있습니다.mysqli()를 사용하는 웹 앱은 사용할 수 없게 되었지만 mysql()을 사용하는 웹 앱도 사용할 수 없게 되었습니다.

그래서 나는 꽤 혼란스럽다.특히 mysql 데이터 디렉토리의 dump/init/restore를 하기 전에는 모든 것이 정상적으로 동작했기 때문에.

조언해 주셔서 감사합니다!

(네, mysql()이 권장되지 않는다는 것은 알지만, "PHP 5.3.8"은 바로 앞에 붙였습니다.새로운 개발을 위해 사용되지 않는 코드를 사용해서는 안 된다고 지적하여 질문에 답하지 않은 모든 분들께 감사드립니다.이제 네가 그렇게 똑똑하다면, 대신 질문에 답해 보자!유지해야 할 레거시 코드가 있습니다.)

이 경우 소켓 위치였습니다.

/etc/php.ini에 적절한 소켓 위치를 삽입하는 것을 언급했지만, phpinfo()에서 "이 dir를 스캔하여 추가 .ini 파일: /usr/local/php5/php.d"라는 다른 정보가 눈에 띄었습니다.이것은 마스터 /etc/php.ini 파일을 읽은 후에 실행됩니다.에휴.

그래서 들어가 보니 mysql 소켓을 잘못된 위치로 설정하고 있는 파일이 있었습니다(mysqli는 아님).더블 으으.

/tmp/mysql.sock을 가리키도록 문제의 파일을 편집하여 "apachctl graceful"과 비올라! (또는 현악기를 싫어하는 사람은 voila!)다시 되네!

(질문에서 설명한 바와 같이) 하드링크나 심볼릭링크를 작성해도 문제가 해결되지 않는 이유를 알 수 없습니다.또한 데이터베이스 덤프/복원만으로 문제가 해결되는 이유를 알 수 없습니다.제가 아는 건 불량 소켓 위치를 추적하고 변경하면 문제가 해결된다는 겁니다.

따라서 한쪽 인터페이스에만 문제가 있는 경우 phpinfo()를 주의 깊게 읽고 /etc/php.ini뿐만 아니라 php 실행 상태를 변경하는 모든 위치를 확인하십시오.

사려 깊고 도움이 되는 코멘트를 해주셔서 감사합니다!

경고 이 확장은 PHP 5.5.0에서 더 이상 사용되지 않으며 PHP 7.0.0에서 제거되었습니다.대신 MySQLi 또는 PDO_MySQL 확장을 사용해야 합니다.MySQL: API 가이드 선택도 참조하십시오.이 기능을 대신할 수 있는 것은 다음과 같습니다.

MySQLi ★★★★★★★★★★★★★★★★★」PDO

mysqli_connect()

PDO::__construct()

언급URL : https://stackoverflow.com/questions/34409669/php-interafce-mysql-not-working-but-mysqli-is-working-why