shaarli / Shaarli

The personal, minimalist, super-fast, database free, bookmarking service - community repo
https://shaarli.readthedocs.io/
Other
3.45k stars 296 forks source link

PHP 8.2 compatibility #2020

Closed anayrat closed 1 year ago

anayrat commented 1 year ago

Hello, Does Shaarli is compatible with php 8.2?

I tried to update from an old debian with php 7.3 and shaarli 12.1 to a new one (bookworm) with php 8.2 and shaarli 12.2. I downloaded 12.2 release, uncompressed it and restored backup data folder. When I try to login, I got this error in the logs:

2023/09/21 12:01:22 [error] 57620#57620: *49 FastCGI sent in stderr: "PHP message: Return type of Pimple\Container::offsetExists($id) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Pimple\Container::offsetGet($id) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Pimple\Container::offsetSet($id, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Pimple\Container::offsetUnset($id) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Slim\Collection::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Slim\Collection::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Slim\Collection::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Slim\Collection::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Slim\Collection::count() sh

Thanks :pray:

nodiscc commented 1 year ago

Hi @anayrat I cannot reproduce this currently (Debian 12, php-fpm 8.2.7-1~deb12u1, apache, Shaarli 0.12.2). I have tried both with a fresh installation, and by upgrading a Debian 11/PHP 7.4 -> Debian 12/PHP 8.2.

Can you provide more info about your setup? (web server virtualhost configuration, php-fpm configuration...). Here is mine (very close to https://shaarli.readthedocs.io/en/master/Server-configuration/):

$ cat /etc/apache2/sites-available/shaarli.conf 
<VirtualHost *:80>
    DocumentRoot /var/www/links.example.org
    ServerName links.example.org
    # Redirect all HTTP requests to HTTPS
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>

<VirtualHost *:443>
  DocumentRoot /var/www/links.example.org
  ServerName  links.example.org
  SSLEngine on
  SSLCertificateFile /etc/ssl/certs/links.example.org.crt
  SSLCertificateKeyFile /etc/ssl/private/links.example.org.key
  DocumentRoot /var/www/links.example.org

  <FilesMatch \.php$>
    SetHandler "proxy:unix:/run/php/php8.2-fpm-shaarli.sock|fcgi://localhost"
  </FilesMatch>

  <Directory /var/www/links.example.org>
      # Required for .htaccess support
      AllowOverride All
      Require all granted
      Header always set Content-Security-Policy "script-src 'self' 'unsafe-inline' https://www.youtube.com https://s.ytimg.com; frame-ancestors 'none'"
  </Directory>

  <FilesMatch ".*\.(?!(ico|css|js|gif|jpe?g|png|ttf|oet|woff2?)$)[^\.]*$">
    Require all denied
  </FilesMatch>

  DirectoryIndex index.php

  <Files "index.php">
    Require all granted
  </Files>

  <Directory /var/www/links.example.org/doc/html/>
    DirectoryIndex index.html
    <FilesMatch ".*\.html">
      Require all granted
    </FilesMatch>
  </Directory>

  <FilesMatch "\.(?:ico|css|js|gif|jpe?g|png|ttf|oet|woff2)$">
      # allow client-side caching of static files
      Header set Cache-Control "max-age=2628000, public, must-revalidate, proxy-revalidate"
  </FilesMatch>

  # serve the Shaarli favicon from its custom location
  Alias favicon.ico /var/www/links.example.org/images/favicon.ico
</VirtualHost>
cat /etc/php/8.2/fpm/pool.d/shaarli.conf 
[shaarli]
user = shaarli
group = shaarli
listen = /run/php/php8.2-fpm-shaarli.sock
listen.owner = shaarli
listen.group = www-data
listen.allowed_clients = 127.0.0.1

;;; PROCESS MANAGEMENT ;;;
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.process_idle_timeout = 20s
;pm.max_requests = 500

;;; MONITORING ;;;
;pm.status_path = /status
;ping.path = /ping
;ping.response = pong

;;; LOGGING/DEBUGGING ;;;
;access.log = log/$pool.access.log
;slowlog = log/$pool.log.slow
;request_slowlog_timeout = 0
;request_slowlog_trace_depth = 20
;catch_workers_output = no
;php_flag[display_errors] = off

;;; LIMITS
php_admin_value[max_execution_time] = 30
php_admin_value[max_input_time] = 60
php_admin_value[memory_limit] = 128M
php_admin_value[post_max_size] = 8M
php_admin_value[upload_max_filesize] = 2M
;rlimit_files = 1024
;chroot =
;chdir = /

Also make sure that the recommended PHP extensions are installed. For Debian 12 these are php8.2-gd php8.2-fpm php8.2-curl php8.2-fpm php8.2-mbstring php8.2-intl php8.2-curl php8.2-gettext php8.2-ldap

More importantly, does the application work despite the message?

anayrat commented 1 year ago

The app works until I try to login. My configuration is more complex, I use a reverse proxy. Here is a complete log:

2023/09/21 15:47:43 [error] 59334#59334: *579 FastCGI sent in stderr: "PHP message: Return type of Pimple\Container::offsetExists($id) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Pimple\Container::offsetGet($id) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Pimple\Container::offsetSet($id, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Pimple\Container::offsetUnset($id) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Slim\Collection::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Slim\Collection::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Slim\Collection::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Slim\Collection::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice; PHP message: Return type of Slim\Collection::count() s
2023/09/21 15:47:43 [error] 59334#59334: *579 FastCGI sent in stderr: " Passing null to parameter #2 ($string) of type string is deprecated" while reading response header from upstream, client: 192.168.10.24, server: shaarli.xxx.info, request: "GET /login HTTP/1.0", upstream: "fastcgi://unix:/run/php/php8.2-fpm.sock:", host: "shaarli.xxx.info", referrer: "https://shaarli.xxx.info/"

It seems I have all requirements:

 php8.2                            
 php8.2-apcu                       
 php8.2-bz2                        
 php8.2-cli                        
 php8.2-common                     
 php8.2-curl                       
 php8.2-dev                        
 php8.2-fpm                        
 php8.2-gd                         
 php8.2-imagick                    
 php8.2-intl                       
 php8.2-mbstring                   
 php8.2-opcache                    
 php8.2-pgsql                      
 php8.2-readline                   
 php8.2-sqlite3                    
 php8.2-tidy                       
 php8.2-xml                        
 php8.2-zip                        
 php-common                        
 php-composer-ca-bundle            
 php-composer-class-map-generator  
 php-composer-metadata-minifier    
 php-composer-pcre                 
 php-composer-semver               
 php-composer-spdx-licenses        
 php-composer-xdebug-handler       
 php-json-schema                   
 php-pear                          
 php-php-gettext                   
 php-psr-container                 
 php-psr-log                       
 php-react-promise                 
 php-seld-signal-handler           
 php-symfony-console               
 php-symfony-deprecation-contracts 
 php-symfony-filesystem            
 php-symfony-finder                
 php-symfony-process               
 php-symfony-service-contracts     
 php-symfony-string                
 pkg-php-tools                     

Here is my nginx configuration:

server {
    listen       80;
    server_name  shaarli.xxx.info;

    root   /var/www/xxx.info/shaarli;
    index  index.html index.htm index.php;

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|oet|woff2?)$ {
        # cache static assets
        expires    max;
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    }
    location = /favicon.ico {
        # serve the Shaarli favicon from its custom location
        alias /var/www/shaarli/images/favicon.ico;
    }

    location /doc/html/ {
        default_type "text/html";
        try_files $uri $uri/ $uri.html =404;
    }
    location / {
        # Slim - rewrite URLs & do NOT serve static files through this location
        try_files _ /index.php$is_args$args;
    }
    #proxy_busy_buffers_size   512k;
    #proxy_buffers   4 512k;
    #proxy_buffer_size   256k;
    # rest of the nginx config below #
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   unix:/run/php/php8.2-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
anayrat commented 1 year ago

Hum, I added these lines in my nginx configuration and it works now:

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;

Thought, I still have errors in the logs.

nodiscc commented 1 year ago

I use a reverse proxy.

I also do, but using apache (proxy configuration above).

Shaarli is compatible with php 8.2?

Since this was the original question, yes it does, as you can see.

fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;

These settings are documented here, I don't clearly see how they could be related to the very specific error message you were getting...

Could this be related to some sort of PHP script caching on the server? Can you revert the fastcgi_buffers/fastcgi_buffer_size you made, try to use Shaarli, and tell us if the problem appears again?

(By the way I was unable to reproduce the error message, even with error_reporting = E_ALL in php.ini)

anayrat commented 1 year ago

Hello, I added these lines because I had this error in the logs:

upstream sent too big header while reading response header from upstream

I still have the error (PHP message: Return type of Pimple\Container::offsetExists($id)) but the app work fine. I will try to take more time to dig it. Thanks!