Also after lots of hair pulling why shell_exec didn't want to work for me I found out that in my case some things needed to be set (which normally are set by default).
the options -jo
-j means: don't recreate the paths found in the archive
-o means: always overwrite files
And I needed to specify the destination path (even though it should unzip in the same directory when not specified), this is done by -d [path]
The strange thing was that I didn't have to put these options when I would give the command on the command-line, only when I would call it with shell_exec.
So the complete command in php would be for me:
shell_exec('unzip -jo /path_to_archive/archive.zip -d /destination_path')
And putting en echo in front will help you a lot.
it should tell you something like this:
Archive: /path_to_zip/archive.zip
inflating: /destination_path/file1.jpeg
inflating: /destination_path/file2.jpeg
inflating: /destination_path/file3.jpeg