pclzip and zero length files in PHP 8.x
xPDO 2.x has issues with zero length files in PHP 8.x. The same code works fine in PHP 7.x. The same issue may occur with xPDO 3.x.
PHP Fatal error: Uncaught ValueError: fread(): Argument #2 ($length) must be greater than 0 in /…/core/xpdo/compression/pclzip.lib.php:2678
I am not sure why this issue occurs only in PHP 8.x, but creating a transport file with PHP 7.4 works well and not with PHP 8.1/8.2 during my tests when an empty file (.gitignore in my case) exists in a folder in a package. If the file has a length of 1 byte everything works well.
It is more of a guide as to why the issue is occurring and how it can be resolved.
Why are you using pclzip with PHP 8? Do you have hosting that does not include the zip extension?
Point being, I'd really love to get rid of the pclzip code.
I am using MAMP locally. For whatever reason this does not use the zip extension.
I can install the extension with https://documentation.mamp.info/en/MAMP-PRO-Mac/FAQ/PHP/Install-a-PHP-extension-using-PECL/ but this has to be done for AFAIK every different PHP version.
Right. The problem is there is no PCLZIP version maintained any longer and it is not compatible with PHP 8. I have no interest in maintaining yet another project.
Before you drop it, PCLZIP currently only has issues with empty files in PHP 8.x in MODX.
Just to be sure. MAMP is compiled with ZIP support. Does it have to use PCLZIP then? Or is it just a wrong check that xPDO uses that part of code?
This issue has been mentioned on MODX Community. There might be relevant details there:
https://community.modx.com/t/subject-issue-with-updating-extension-in-modx-3-0-5/8137/2
It is important that archive_with is disabled in the MODX system settings. Otherwise it tries to use PCLZIP even if it is not needed. So if you PCLZIP is dropped, the system setting has to be deactivated or removed.