-
-
Notifications
You must be signed in to change notification settings - Fork 205
Description
Environment
- Laravel Zero Version: 12.x
- PHP Version: 8.4 but also tried in 8.2
Description
The Updater component crashes when executed from a compiled PHAR file due to zlib compression errors that prevent proper class autoloading.
Steps to Reproduce
- Create a Laravel Zero application with the updater component
- Compile the application into a PHAR file
- Run the update command from the compiled PHAR
- The application crashes during the update process
Error Output
Checking for a new version...
=============================
PHP Fatal error: Uncaught ErrorException: include(): zlib: data error in phar:///path/to/app.phar/.box/vendor/composer/ClassLoader.php:571
Stack trace:
#0 phar:///path/to/app.phar/vendor/laravel-zero/foundation/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(266): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'include(): zlib...', 'phar:///path/to/...', 571)
#1 phar:///path/to/app.phar/.box/vendor/composer/ClassLoader.php(571): Illuminate\Foundation\Bootstrap\HandleExceptions->Illuminate\Foundation\Bootstrap\{closure}(8, 'include(): zlib...', 'phar:///path/to/...', 571)
#2 phar:///path/to/app.phar/.box/vendor/composer/ClassLoader.php(571): include('phar:///path/to/...')
#3 phar:///path/to/app.phar/.box/vendor/composer/ClassLoader.php(428): Composer\Autoload\includeFile('phar:///path/to/...')
#4 [internal function]: Composer\Autoload\ClassLoader->loadClass('App\\Exceptions\\...')
#5 phar:///path/to/app.phar/vendor/illuminate/container/Container.php(889): ReflectionClass->__construct('App\\Exceptions\\...')
#6 phar:///path/to/app.phar/vendor/illuminate/container/Container.php(770): Illuminate\Container\Container->build('App\\Exceptions\\...')
#7 phar:///path/to/app.phar/vendor/laravel-zero/foundation/src/Illuminate/Foundation/Application.php(862): Illuminate\Container\Container->resolve('App\\Exceptions\\...', Array, false)
#8 phar:///path/to/app.phar/vendor/illuminate/container/Container.php(295): Illuminate\Foundation\Application->resolve('App\\Exceptions\\...', Array, false)
#9 phar:///path/to/app.phar/vendor/illuminate/container/Container.php(885): Illuminate\Container\Container->Illuminate\Container\{closure}(Object(LaravelZero\Framework\Application), Array)
#10 phar:///path/to/app.phar/vendor/illuminate/container/Container.php(770): Illuminate\Container\Container->build(Object(Closure))
#11 phar:///path/to/app.phar/vendor/laravel-zero/foundation/src/Illuminate/Foundation/Application.php(862): Illuminate\Container\Container->resolve('Illuminate\\Cont...', Array, true)
#12 phar:///path/to/app.phar/vendor/illuminate/container/Container.php(706): Illuminate\Foundation\Application->resolve('Illuminate\\Cont...', Array)
#13 phar:///path/to/app.phar/vendor/laravel-zero/foundation/src/Illuminate/Foundation/Application.php(847): Illuminate\Container\Container->make('Illuminate\\Cont...', Array)
#14 phar:///path/to/app.phar/vendor/laravel-zero/foundation/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(299): Illuminate\Foundation\Application->make('Illuminate\\Cont...')
#15 phar:///path/to/app.phar/vendor/laravel-zero/foundation/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(218): Illuminate\Foundation\Bootstrap\HandleExceptions->getExceptionHandler()
#16 phar:///path/to/app.phar/vendor/laravel-zero/foundation/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(204): Illuminate\Foundation\Bootstrap\HandleExceptions->renderForConsole(Object(ErrorException))
#17 phar:///path/to/app.phar/vendor/laravel-zero/foundation/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(266): Illuminate\Foundation\Bootstrap\HandleExceptions->handleException(Object(ErrorException))
#18 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->Illuminate\Foundation\Bootstrap\{closure}(Object(ErrorException))
#19 {main}
thrown in phar:///path/to/app.phar/.box/vendor/composer/ClassLoader.php on line 571
PHP Fatal error: Uncaught ErrorException: include(): zlib: data error in phar:///path/to/app.phar/.box/vendor/composer/ClassLoader.php:571
Stack trace:
#0 phar:///path/to/app.phar/vendor/laravel-zero/foundation/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(266): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'include(): zlib...', 'phar:///path/to/...', 571)
#1 phar:///path/to/app.phar/.box/vendor/composer/ClassLoader.php(571): Illuminate\Foundation\Bootstrap\HandleExceptions->Illuminate\Foundation\Bootstrap\{closure}(8, 'include(): zlib...', 'phar:///path/to/...', 571)
#2 phar:///path/to/app.phar/.box/vendor/composer/ClassLoader.php(571): include('phar:///path/to/...')
#3 phar:///path/to/app.phar/.box/vendor/composer/ClassLoader.php(428): Composer\Autoload\includeFile('phar:///path/to/...')
#4 phar:///path/to/app.phar/vendor/laravel-zero/foundation/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(255): Composer\Autoload\ClassLoader->loadClass('Symfony\\Compone...')
#5 phar:///path/to/app.phar/vendor/laravel-zero/foundation/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(242): Illuminate\Foundation\Bootstrap\HandleExceptions->fatalErrorFromPhpError(Array, 0)
#6 phar:///path/to/app.phar/vendor/laravel-zero/foundation/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(266): Illuminate\Foundation\Bootstrap\HandleExceptions->handleShutdown()
#7 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->Illuminate\Foundation\Bootstrap\{closure}()
#8 {main}
thrown in phar:///path/to/app.phar/.box/vendor/composer/ClassLoader.php on line 571
Expected Behavior
The updater should work seamlessly in compiled PHAR files without throwing zlib compression errors.
Actual Behavior
The application crashes with a zlib: data error during class autoloading when running the updater from a compiled PHAR file. The error occurs when trying to load various classes including exception handlers and Symfony components, indicating a deeper issue with how classes are compressed and loaded in the PHAR context.
Root Cause
The error trace reveals a zlib: data error occurring in the Composer ClassLoader when trying to include files from the compiled PHAR. This suggests that the issue is related to:
- PHAR Compression Issues: The zlib compression used during PHAR compilation may be corrupting certain files
- Class Autoloading Problems: The error cascade starts when trying to autoload classes and triggers the exception handling system
- OutputStyle Dependencies: The original issue is located in
vendor/laravel-zero/framework/src/Components/Updater/Updater.phpin theupdate()method when calling$output->success(), but the underlying problem appears to be broader class loading issues in the PHAR context
The specific problematic line:
$output->success(sprintf('Updated from version %s to %s.', $this->updater->getOldVersion(),
$this->updater->getNewVersion()));The success() method uses createBlock() which internally calls:
$indentLength = 0;
$prefixLength = Helper::width(Helper::removeDecoration($this->getFormatter(), $prefix));
$lines = [];This Helper class from Laravel is not accessible when running from a compiled PHAR due to compression/autoloading issues.
Affected Code
File: vendor/laravel-zero/framework/src/Components/Updater/Updater.php
public function update(OutputStyle $output): void
{
$result = $this->updater->update();
if ($result) {
$output->success(sprintf('Updated from version %s to %s.', $this->updater->getOldVersion(),
$this->updater->getNewVersion()));
exit(0);
} elseif (! $this->updater->getNewVersion()) {
$output->success('There are no stable versions available.');
} else {
$output->success('You have the latest version installed.');
}
}Proposed Solutions
Solution 1: Preload Dependencies
Add a preliminary message to ensure Helper classes are loaded before the critical success message:
public function update(OutputStyle $output): void
{
// Preload dependencies by calling a method that uses Helper classes
$output->comment('Update started...');
$result = $this->updater->update();
if ($result) {
$output->success(sprintf('Updated from version %s to %s.', $this->updater->getOldVersion(),
$this->updater->getNewVersion()));
exit(0);
} elseif (! $this->updater->getNewVersion()) {
$output->success('There are no stable versions available.');
} else {
$output->success('You have the latest version installed.');
}
}Solution 2: Use Simple Output Methods (Recommended)
Replace success() calls with writeln() to avoid dependency on Helper classes:
public function update(OutputStyle $output): void
{
$result = $this->updater->update();
if ($result) {
$output->writeln(sprintf('<info>Updated from version %s to %s.</info>', $this->updater->getOldVersion(),
$this->updater->getNewVersion()));
exit(0);
} elseif (! $this->updater->getNewVersion()) {
$output->writeln('<info>There are no stable versions available.</info>');
} else {
$output->writeln('<info>You have the latest version installed.</info>');
}
}Additional Information
This bug specifically affects Laravel Zero applications when:
- Compiled into PHAR files
- Using the updater component
- The error manifests as a
zlib: data errorduring class autoloading - Multiple classes fail to load including App\Exceptions and Symfony components
The issue appears to be a combination of:
- PHAR compression problems affecting class loading
- The updater's reliance on OutputStyle methods that trigger extensive class autoloading
- Cascading failures in the exception handling system
Priority
Medium - This affects the core functionality of self-updating applications built with Laravel Zero when distributed as PHAR files.
Labels
- bug
- phar-compression
- autoloading
- laravel-zero-12